将char数组转换为多个String

时间:2017-06-22 14:53:56

标签: java arrays string java-8

我需要将char数组转换为一定大小的几行。例如,考虑这个数组:

char[] bases = new char[]{'a', 'c', 'c', 't', 'a', 'c', 'a', 't', 'a', 'c', 'c', 't', 'a', 'c', 'a', 't'};

预期输出的大小为 5

accta
catac
ctaca

我目前正在使用此代码:

    int ls = 5; 
    String str = ""; 
    for (int i = 1; i < bases.length; i++) {
        str += bases[i - 1];
        if (i%ls == 0) {
            str += '\n';
        }
    }

在java 8中是否有一些内置函数可以实现这一点?有没有更好的方法来解决这个问题?

5 个答案:

答案 0 :(得分:5)

您可以将char[]转换为字符串然后您可以使用拆分与一些正则表达式:

String s = String.valueOf(bases);//result = acctacatacctacat
System.out.println(Arrays.toString(s.split("(?<=\\G.{5})")));

如果你想把它放在一行:

String[] spl = String.valueOf(bases).split("(?<=\\G.{5})");

<强>输出

[accta, catac, ctaca, t]

答案 1 :(得分:2)

可能利用substring()使其更简单。 (首先将char []转换为字符串)

 int ls = 5; 
 for (int i = ls; i < bases.length; i+=ls)
     someList.append(bases.substring((i-ls, i)));

答案 2 :(得分:2)

你几乎不应该在循环中使用字符串连接来构建字符串。

使用StringBuilder

StringBuilder sb = new StringBuilder(bases.length + (4 + bases.length) / 5);
for (int i = 0; i < bases.length; i += 5) {
  sb.append(bases, i, Math.min(5, bases.length - i));
  sb.append("\n");
}
String str = sb.toString();

答案 3 :(得分:0)

因为在这种情况下,您对编写序列非常清楚,或许自定义代码创建相应的char[]将是最有效的:

   final int ls = 5;
   final char[] result = new char[bases.length + (bases.length + ls - 1) / ls]
   int nextIndex = 0;
   for (int i = 0; i < bases.length; i += ls) {
      final int size = bases.length - i >= ls ? ls : bases.length - i;
      System.arraycopy(bases, i, result, nextIndex, size);
      nextIndex += size;
      result[nextIndex++] = '\n'; 
   }
   final String resultAsString = new String(result);

答案 4 :(得分:0)

这可以是你的问题的另一个解决方案,即使用java8 Stream功能:(为了理解我将逐步留下答案,但很多可以在以后简化和简化/收集)

int charsPerChunk = 5;
char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '+', 'X', 'o', 'c', 'e', '!' };
// turn the char array into a Stream of Characters
Stream<Character> myStreamOfCharacters = IntStream.range(0, myCharArray.length).mapToObj(i -> myCharArray[i]);
// collect that into a list of characters
List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList());

int size = myListOfCharacters.size();
int fullChunks = (size - 1) / charsPerChunk;
// get a stream of list of characters
Stream<List<Character>> result = IntStream
          .range(0, fullChunks + 1)
          .mapToObj( x -> myListOfCharacters.subList(x * charsPerChunk, x == fullChunks ? size : (x + 1) * charsPerChunk));

// print it
result.forEach(System.out::println);