2013-08-01 12 views
10

Jak podzielić ciąg znaków na 2 znaków za pomocą shifting. Na przykład;Java, sposób dzielenia łańcucha znaków z przesunięciem

mój ciąg jest = todayiscold

Mój cel jest: "to","od","da","ay","yi","is","sc","co","ol","ld"

ale z tym kodem:

Arrays.toString("todayiscold".split("(?<=\\G.{2})"))); 

dostaję: ` "na", "da", "yi", "co", "ld"

ktoś pomaga?

+4

String.split zostanie podzielony w określonych punktach. Łańcuchy te nie mogą nakładać się z definicji. –

Odpowiedz

7

Spróbuj tego:

 String e = "example"; 
     for (int i = 0; i < e.length() - 1; i++) { 
      System.out.println(e.substring(i, i+2)); 
     } 
+2

@Jason Zgadzam się, ale skuteczne rozwiązanie zwykle bardziej złożone, tutaj proponuję proste i łatwe do zrozumienia rozwiązanie. To pytanie w ogóle nie dotyczy wydajności. – nkukhar

+1

Nie, nie zgadzam się. Powinieneś pomyśleć o wydajności tam, gdzie robi metr. "Przedwczesna optymalizacja jest źródłem wszelkiego zła (lub przynajmniej większości) w programowaniu" ([Donald Knuth]) (http://en.wikiquote.org/wiki/Donald_Knuth)) – nkukhar

+0

Drugi najbardziej niezrozumiany cytat z historii programowania. – jason

4

pomocą pętli:

String test = "abcdefgh"; 
List<String> list = new ArrayList<String>(); 
for(int i = 0; i < test.length() - 1; i++) 
{ 
    list.add(test.substring(i, i + 2)); 
} 
1

mogę użyć split w tym przypadku, ponieważ wszystko ma podziału jest znaleźć miejsce do Split i hamulca swój ciąg w tym miejscu, więc nie możesz zrobić tej samej postaci w dwóch częściach.

Zamiast tego można skorzystać z mechanizmów Wzór/Matcher jak

String test = "todayiscold"; 
List<String> list = new ArrayList<String>(); 

Pattern p = Pattern.compile("(?=(..))"); 
Matcher m = p.matcher(test); 
while(m.find()) 
    list.add(m.group(1)); 

lub nawet lepiej iteracyjne nad swoimi postaciami Atring i tworzyć podciągi jak w answer

2

następujący kod oparte D-rock w regex powinien pracować:

String str = "todayiscold"; 
Pattern p = Pattern.compile("(?<=\\G..)"); 
Matcher m = p.matcher(str); 
int start = 0; 
List<String> matches = new ArrayList<String>(); 
while (m.find(start)) { 
    matches.add(str.substring(m.end()-2, m.end())); 
    start = m.end()-1; 
} 
System.out.println("Matches => " + matches); 

Sztuczka polega na użyciu end()-1 z ostatniego meczu w find() metoda.

wyjściowa:

Matches => [to, od, da, ay, yi, is, sc, co, ol, ld]