SPOJ - JSPACE - Spacje

0

Cześć,
Mam problem z Spoj-em.Zadanko brzmi tak:
W celu zaoszczędzenia ilości znaków w krótkich wiadomościach tekstowych (SMS) nie pisze się spacji, a każdy wyraz rozpoczyna się wielką literą. Twoim zadaniem jest otrzymany tekst przerobić zgodnie z powyższym trendem.

Input
Na wejściu znajduje się dowolny tekst bez polskich znaków.

Output
Tekst wprowadzony z wejścia, ale bez spacji. Ponadto każdy wyraz poprzedzony na wejściu spacją zaczyna się wielką literą.

Example
Input:
Dzisiaj jest czwartek,
A jutro bedzie piatek.

Output:
DzisiajJestCzwartek,
AJutroBedziePiatek

Wg tego co testuje ,to to działa. Liter na początku linijki według tego co rozumiem ,ma nie powiększać ,gdy są małe.Drugą wersję tez testowałem i również spoj nie przepuścił. Podejrzewam ,że chodzi o to ,iż tekst może być dowolny i nie zawsze warunkiem jego zakończenia musi być kropka. Ale jak wtedy to rozwiązać ? Z metody "hasNextLine()" korzystanie skończyło się brakiem stopu przy wczytywaniu. Ma ktoś jakiś pomysł jak to można rozwiązać ,nakieruje ?
edit: podwójne,potrójne spacje są uwzględnione w rozwiązaniu.

import java.lang.*;
import java.util.Scanner;

public class Main {

        public String method(String[] txt) {
            StringBuilder str = new StringBuilder();
            boolean beforeCharSpace = false;
            for (int i = 0; i < txt.length; i++) {
                if (txt[i] == null) {
                    break;
                }
                for (int j = 0; j < txt[i].length(); j++) {
                    char character = txt[i].charAt(j);
                    if (character == '.') {
                        str.append(character);
                        break;
                    }
                    if (character == ' ') {
                        beforeCharSpace = true;
                    } else if (beforeCharSpace) {
                        int buf = character;
                        if (character >= 97 && character <= 122) {
                            buf -= 32;
                        }
                        str.append((char) buf);
                        beforeCharSpace = false;
                    } else {
                        str.append(character);
                    }
                }
                if ((i + 1) < txt.length && txt[i + 1] != null) {
                    str.append(System.lineSeparator());
                }
            }
            return str.toString();
        }
        public static void main(String[] args) throws java.lang.Exception {
            boolean endOfMessage = true;
            Main main = new Main();
            String[] txt = new String[10];
            Scanner scanner = new Scanner(System.in);
            int i = 0;
            while (endOfMessage) {
                txt[i] = scanner.nextLine();
                for (int j = 0; j < txt[i].length(); j++) {
                    if (txt[i].charAt(j) == '.') {
                        endOfMessage = false;
                        break;
                    }
                }
                i++;
            }
            System.out.print(main.method(txt));
        }
}
0

Nie wpatrywałem się w kod ale ja jak robiłem to zadanie też mi nie przechodziło mimo, że myślałem że mam dobrze.
W twoim kodzie input wpisywany jest w 1 linijce czy po enterze przechodzi Ci do następnej linii i dalej możesz wpisywać?

0

Tak jest wpisywany w pierwszej linijce ,po enterze przechodzi do kolejnej i mogę dalej wpisywać. Przykładowy imput i output:

Test test test,
test test test,
 test test, 
test.
TestTestTest,
testTestTest,
TestTest,
test.

Litery pierwsze w linijce bez poprzedzającej jej spacji chyba muszą być małe? Szukając odpowiedzi ,a taką podpowiedź trafiłem. Jedynym ograniczeniem jest tablica która długość 10.

0

W c# jak pisałem użyłem listy zamiast tablicy, weź odpowiednik w Javie (ArrayList?). Nie musisz wtedy ograniczać ilości wpisanego tekstu tylko każdą linijkę dodawać dynamicznie

0
pavarotti napisał(a):

W c# jak pisałem użyłem listy zamiast tablicy, weź odpowiednik w Javie (ArrayList?). Nie musisz wtedy ograniczać ilości wpisanego tekstu tylko każdą linijkę dodawać dynamicznie

Ale "." dalej traktować jako koniec wiadomości ? Bo może i tu jest problem ,myślałem jeszcze nam znakiem '\0' ,ale nie wiem jak to zrealizować,tym bardziej ,że imput wchodzi z konsoli a nie pliku.
W każdym razie ,dziękuję za chęć niesienia pomocy :D

0

Ja miałem tak że po kliknięciu drugiego entera. W C# wyglądało to tak o:

List<string> input = new List<string>;
stringi line ="";
while ((line = Console.ReadLine()) != null & line != "")
{
    input.Add(line);
}

Więc po wpisaniu tekstu enter przechodził niżej, a po drugim enterze jak nic nie wpisałem w konsoli kończyło się pobieranie danych z klawiatury

Na SO znalazłem takie coś (lekko przerobiłem - zamiast wypisywania na ekran co linie, zapisywanie do listy, ale musisz sprawdzić czy się skompiluje, ewentualnie nanieść jakieś małe poprawki):

import java.util.Scanner;
import java.util.ArrayList;

public class JavaApp {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> input = new ArrayList<String>();
        String line;
        while(true){
            line = scanner.nextLine();
            input.Add(line);
            if(line.equals("")){
                break;
            }
        }
    }  
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1