2012-03-03 9 views
5

Czy ktoś może doradzić w sprawie, która mnie podsłuchuje? Mam plik .jar Javy, która zwraca ciąg od sposobu składa się w następujący sposób:Dzielenie łańcucha znaków w Javie

integer integer integer block_of_text 

To trzy liczby całkowite, które mogą być dodatnie lub ujemne, oddzielonych pojedynczymi odstępami, a następnie kolejna przestrzeń przed blokiem tekstu, który może składać się z dowolnych znaków, ale nie powinien zawierać deklaracji karetki. Teraz przypuszczam, że mogę odczytać podciągi do znaku spacji dla każdej z początkowych liczb całkowitych, a następnie po prostu odczytać pozostały tekst za jednym zamachem.

Należy dodać, że bloku tekstu nie należy dzielić, niezależnie od tego, co zawiera.

Ale czy ktoś może zaproponować lepszą alternatywę?

Dzięki respondentom. To uratowało mi ból głowy!

+0

Czy blok_tekstu zawiera znaki nowej linii? W szczególności "\ n" w systemie Linux/OS X lub "\ r \ n" w systemie Windows. Zakładam, że tak, ponieważ powiedziałeś, że mogą tam istnieć dowolne postacie. –

+0

blok tekstu może zawierać spacje? – sgowd

+0

Zwroty karetki i znaki nowej linii - nie. Spaces - tak. –

Odpowiedz

11

Można użyć formy String#split(regex,limit) which takes a limit:

String s = "123 456 789 The rest of the string"; 
String ss[] = s.split(" ", 4); 
// ss = {"123", "456", "789", "The rest of the string"}; 
+0

Nie wiedziałem o używaniu podziału w ten sposób. –

7

Można użyć String.split z miejsca jako separator i ustawić limit 4:

String[] result = s.split(" ", 4); 

Można również użyć Scanner. To nie tylko podzieli tekst, ale także przeanalizuje liczby całkowite do int. W zależności od tego, czy potrzebne są trzy liczby całkowite jak int lub String, to może się okazać bardziej wygodne:

Scanner scanner = new Scanner(s); 
int value1 = scanner.nextInt(); 
int value2 = scanner.nextInt(); 
int value3 = scanner.nextInt(); 
scanner.skip(" "); 
String text = scanner.nextLine(); 

Zobacz pracuje w trybie online: ideone.

+0

+1 dla wygodnego użytkowania skanera. – maerics

3

Jednym prostym sposobem (ponieważ powiedziałeś, że nie będzie nowych linii w bloku_tekstu) jest użycie Scanner. Jest to narzędzie do dzielenia danych wejściowych na podstawie określonego podziału i zwracania odpowiednich typów z powrotem do ciebie. Na przykład można użyć metod hasNextInt() i nextInt(), aby sprawdzić liczbę całkowitą w danych wejściowych i faktycznie pobrać ją ze strumienia.

Na przykład:

Scanner scanner = new Scanner(System.in); // Arg could be a String, another InputStream, etc 
int[] values = new int[3]; 
values[0] = scanner.nextInt(); 
values[1] = scanner.nextInt(); 
... 
String description = scanner.nextLine(); 

Można to wykorzystać, dopóki nie wyczerpane strumień wejściowy i rozpocząć korzystanie z wartości, jak trzeba.

Oto więcej szczegółów na temat korzystania Scanner: If ... is not an int {

0

Najprościej podzielić ciąg jest za pomocą metody split.

String gen = "some texts here"; 
String spt[] = gen.split(" "); //This will split the string gen around the spaces and stores them into the given string array 


Aby usunąć całkowite według Twojego pytania, należy uruchomić indeks tablicy z 3.
Mam nadzieję, że pomoże.