2014-10-17 78 views
1

我正在研究一個工具,並且需要將文本拆分爲列。將Java字符串操縱爲列

例如 - 1 2 3 4 5 6 7 8 9 1

將返回此,如果週期爲2 - 1,3,5,7,9 和 2,4,6,8 ,1

IF的週期爲3 - 1,4,7,1和2,5,8 和 3,6,9

等等等等 我掙扎構造此alogirithm , 任何幫助,將不勝感激!如何構建這些算法最好?我把它寫在紙上,但不能轉換成代碼!我被困在構建第二個循環來增加期限。下面是我到目前爲止

String to_test = "1234567891"; 
    StringBuilder sb = new StringBuilder(); 

    int period = 2; 
    int startAt = 0; 
    int characterToCheck = 0; 

    while (startAt < period) { 
     for (int i = 0; i < to_test.length(); i++) { 
      if (i % period == 0) { 
       sb.append(to_test.charAt(characterToCheck)); 
      } 
      characterToCheck++; 
     } 
     // String is constructed 
     System.out.println(sb); 
     sb = new StringBuilder(); 
     startAt ++; 
     characterToCheck = startAt; 
    } 

} 
+0

我認爲字符數組是很容易的路要走 – 2014-10-17 12:14:00

回答

1

嘗試這個。

import java.util.Arrays; 

public class Tester1 { 

    public static void main(String[] args){ 
     String to_test = "1234567891"; 
     StringBuilder sb = new StringBuilder(""); 

     char[] charArray = to_test.toCharArray(); 

     int period = 3; 

     for (int j=0;j<period;j++){ 
      for (int i=j;i<charArray.length;i+=period){ 
       sb.append(charArray[i]); 
      } 
      sb.append(";"); 
     } 
     System.out.println(sb); 
    } 
} 
+0

對不起,沒看過,直到結束。我會更新它。 – aeliv002 2014-10-17 12:45:13

+0

非常感謝! – 2014-10-17 13:55:29

0

一個例子你應該這樣做在一個for循環,並填寫n的StringBuilder(n = period

public static void main(String[] args) { 
    StringBuilder[] ret = period("1234567891", 3); 
    System.out.println(Arrays.asList(ret)); 
} 

public static StringBuilder[] period(String s, int period) { 
    StringBuilder[] ret = new StringBuilder[3]; 
    for (int i = 0; i < period; i++) { 
     ret[i] = new StringBuilder(); 
    } 
    for (int i = 0; i < s.length(); i++) { 
     ret[i % period].append(s.charAt(i)); 
    } 

    return ret; 
} 
0

在這裏你去。這將爲你工作。無硬編碼所需:)

public static void main(String[] args) { 
    String s = "1234567891"; 
    int period = 3; 
    List<List<String>> stringList = new ArrayList<List<String>>(); 
    // Initializing number of lists required based on period. 
    for (int i = 0; i < period; i++) { 
     List<String> l1 = new ArrayList<String>(); 
     stringList.add(l1); 
    } 
    // debug this part of code :P. I am adding the digits based on period length 
    for (int i = 0; i < s.length();) { 
     for (int j = 0; j < period; j++) { 
      if (i > s.length() - 1) 
       break; 
      stringList.get(j).add(String.valueOf(s.charAt(i))); 
      i++; 
     } 
    } 
// Displaying list of lists 
    for (List<String> ls : stringList) { 
     for (String str : ls) { 
      System.out.print(" " + str); 
     } 
     System.out.println(); 
    } 
} 

O/P:

1 4 7 1 
2 5 8 
3 6 9 

爲週期= 2:

1 3 5 7 9 
2 4 6 8 1 

爲週期= 4:

1 5 9 
2 6 1 
3 7 
4 8 
0

我已經爲它創建了這個小函數,基本上你使用的while循環是for循環。

公共靜態無效toColumn(字符串to_test,詮釋期){

StringBuilder sb = new StringBuilder(); 

    for(int i=0;i<period;i++){ 
     for(int j=i;j<to_test.length();j+= period){ 
      sb.append(to_test.charAt(j)); 
     } 
     sb.append('\n'); 
    } 

    System.out.println(sb); 
} 
0

你也可以嘗試這樣的事情(這是不是最高效的解決方案):

public class Foo { 
    public Foo(String aString, int period){ 
     List<ArrayList<String>> out = new ArrayList<ArrayList<String>>(); 

     for(int i = 0; i < period; i++){ 
      out.add(new ArrayList<String>()); 
     } 

     int i = 0; 

     while(i < aString.length()){ 
      for(int j = 0; j < period && i < aString.length(); j++){ 
       out.get(i % period).add(String.valueOf(aString.charAt(i))); 
       i++; 
      } 
     } 

     System.out.println(out); 
    } 
} 

輸出:

new Foo("1234567891", 1); // output [[1, 2, 3, 4, 5, 6, 7, 8, 9, 1]] 
new Foo("1234567891", 2); // output [[1, 3, 5, 7, 9], [2, 4, 6, 8, 1]] 
new Foo("1234567891", 3); // output [[1, 4, 7, 1], [2, 5, 8], [3, 6, 9]] 
+0

非常感謝! – 2014-10-17 13:56:00

+0

如果你喜歡答案,那麼你可以給用戶口碑,你可以接受更好的答案。 @JavaNoob – 2014-10-17 13:58:07

0

從數學的角度看待這個問題時,可以輕鬆地阻止我的,你可以使用一個數組來存儲你的價值觀和來計算指數:

final char[][] result = new char[period][yourString.length()/period + ((yourString.length() % period) > 0 ? 1 : 0)];  

IntStream.range(0, yourString.length()).forEach(index -> result[index % period][index/period] = yourString.charAt(index)); 

完蛋了。

當運行不同的值試驗period

public static void main(String[] args) { 
    final String to_test = "1234567891"; 

    for (int i = 1; i < 5; i++) { 
     final int period = i; 

     // create result array based on input values 
     final char[][] result = new char[period][to_test.length()/period + ((to_test.length() % period) > 0 ? 1 : 0)]; 

     // iterate over the characters and assign each character to the right array index 
     IntStream.range(0, to_test.length()) 
       .forEach(index -> result[index % period][index/period] = to_test.charAt(index)); 

     // print the calculated result 
     System.out.println("Period = " + period); 
     for (char[] line : result) { 
      for (int j = 0; j < line.length; j++) { 
       // print character and check if trailing ',' is need 
       System.out.print(line[j] + ((j < line.length - 1 && line[j + 1] != '\0')? ", " : "")); 
      } 
      System.out.println(); 
     } 
     System.out.println(); 
    } 
} 

你得到這個輸出

Period = 1 
1, 2, 3, 4, 5, 6, 7, 8, 9, 1 

Period = 2 
1, 3, 5, 7, 9 
2, 4, 6, 8, 1 

Period = 3 
1, 4, 7, 1 
2, 5, 8 

Period = 4 
1, 5, 9 
2, 6, 1 
3, 7 
+0

非常感謝! – 2014-10-17 13:56:38

+0

@JavaNoob歡迎您。請將最能幫助您的答案標記爲「Accepted」。 – ifloop 2014-10-17 14:02:17