将一个char数组转换为几个String [重复]

Posted

技术标签:

【中文标题】将一个char数组转换为几个String [重复]【英文标题】:convert an array of char into several String [duplicate] 【发布时间】:2017-11-25 22:32:42 【问题描述】:

我需要将一个 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 中是否有一些内置函数可以实现这一点?有没有更好的方法来解决这个问题?

【问题讨论】:

一个 html 元素?这看起来更像 DNA。 我不明白 HTML 与此有何关联。 new String(bases, 0, 5)new String(bases, 5, 10) 抱歉忘记更新标题了,应该会更好 几个字符串?还是一个字符串,每 5 个字符换行一次? 【参考方案1】:

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

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]

【讨论】:

【参考方案2】:

可能可以利用 substring() 来简化它。 (先把 char[] 转成字符串)

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

【讨论】:

小心:如果bases.length % ls != 0,这将无法正常工作。 我相信它仍然可以工作,只是不会得到字符串末尾的剩余字符——在如何处理这些问题中没有指定这些字符——但他的例子只是删除了结束字符。 如果ls == 5bases.length &lt;= 4,使用i == ls 作为子字符串的第二个参数会失败。 如果设置了这些条件,for循环将不会进入第一次迭代,因为5 &lt; 4将返回false。 啊,好的。所以,你没有得到一个例外,你只是错过了最后一个子字符串:)【参考方案3】:

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

使用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();

【讨论】:

@YCF_L 啊,第三个参数是长度,不是结束索引。谢谢。 (令人困惑的是,append(CharSequence, int, int) 中的第三个参数是结束索引,而不是长度)。【参考方案4】:

这可能是您使用 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);

【讨论】:

我认为在这种情况下使用流是多余的。 同意,特别是这部分....myStreamOfCharacters【参考方案5】:

由于在这种情况下,您对编写所需的序列有一个非常清晰的概念,也许编写一个自定义代码来创建相应的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);

【讨论】:

请注意,这会在bases[0] 之后插入第一个换行符,而不是在bases[ls-1] 之后。 @AndyTurner 太棒了!谢谢。 我已更改代码以使用可能比 StringBuiler 更有效的自定义解决方案。

以上是关于将一个char数组转换为几个String [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将char数组转换为int数组[重复]

怎么把char 数组转换成String?

如何将 String 转换为 char 数组?

将NSString转换为char数组[重复]

将 std::String 转换为 char * [重复]

如何将char数组转换回字符串[重复]