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