将一个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 == 5
和bases.length <= 4
,使用i == ls
作为子字符串的第二个参数会失败。
如果设置了这些条件,for循环将不会进入第一次迭代,因为5 < 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章