2014-10-17 56 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