使用 Stream 从字符串中获取二维 char 数组
Two dimensional char array from string using Stream
我要从字符串创建二维数组:
char[][] chars;
String alphabet = "abcdefghijklmnopqrstuvwxyz";
所以数组将说明这个矩阵:
但是我如何使用 Java 8 个流来做到这一点,因为我不想通过随意循环来做到这一点?
糟糕的循环。他们的名声很差。我怀疑基于流的解决方案会像这样清晰:
int n = alphabet.length();
char[][] cs = new char[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cs[i][j] = alphabet.charAt((i + j) % n);
}
}
如果我必须用流来做,我想我会做这样的事情:
IntStream.range(0, n)
.forEach(
i -> IntStream.range(0, n).forEach(j -> cs[i][j] = alphabet.charAt((i + j) % n)));
或者,如果我不关心创建大量中间字符串:
cs = IntStream.range(0, n)
.mapToObj(i -> alphabet.substring(i) + alphabet.substring(0, i))
.map(String.toCharArray())
.toArray(new char[n][]);
一种更有趣的方式:
char[][] cs = new char[n][];
cs[0] = alphabet.toCharArray();
for (int i = 1; i < n; ++i) {
cs[i] = Arrays.copyOfRange(cs[i-1], 1, n+1);
cs[i][n-1] = cs[i-1][0];
}
您可以使用 Stream.iterate()
递增地旋转每个字符串,然后将它们转换为 char
数组:
chars = Stream.iterate(alphabet, str -> str.substring(1) + str.charAt(0))
.limit(alphabet.length())
.map(String::toCharArray)
.toArray(char[][]::new);
或者您可以使用 Apache 的 StringUtils.rotate()
:
按索引旋转每个字符串
chars = IntStream.range(0, alphabet.length())
.mapToObj(i -> StringUtils.rotate(alphabet, -i))
.map(String::toCharArray)
.toArray(char[][]::new);
或者使用 Guava 的 Chars
工具 class:
chars = Stream.generate(alphabet::toCharArray)
.limit(alphabet.length())
.toArray(char[][]::new);
IntStream.range(0, chars.length)
.forEach(i -> Collections.rotate(Chars.asList(chars[i]), -i));
我要从字符串创建二维数组:
char[][] chars;
String alphabet = "abcdefghijklmnopqrstuvwxyz";
所以数组将说明这个矩阵:
但是我如何使用 Java 8 个流来做到这一点,因为我不想通过随意循环来做到这一点?
糟糕的循环。他们的名声很差。我怀疑基于流的解决方案会像这样清晰:
int n = alphabet.length();
char[][] cs = new char[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cs[i][j] = alphabet.charAt((i + j) % n);
}
}
如果我必须用流来做,我想我会做这样的事情:
IntStream.range(0, n)
.forEach(
i -> IntStream.range(0, n).forEach(j -> cs[i][j] = alphabet.charAt((i + j) % n)));
或者,如果我不关心创建大量中间字符串:
cs = IntStream.range(0, n)
.mapToObj(i -> alphabet.substring(i) + alphabet.substring(0, i))
.map(String.toCharArray())
.toArray(new char[n][]);
一种更有趣的方式:
char[][] cs = new char[n][];
cs[0] = alphabet.toCharArray();
for (int i = 1; i < n; ++i) {
cs[i] = Arrays.copyOfRange(cs[i-1], 1, n+1);
cs[i][n-1] = cs[i-1][0];
}
您可以使用 Stream.iterate()
递增地旋转每个字符串,然后将它们转换为 char
数组:
chars = Stream.iterate(alphabet, str -> str.substring(1) + str.charAt(0))
.limit(alphabet.length())
.map(String::toCharArray)
.toArray(char[][]::new);
或者您可以使用 Apache 的 StringUtils.rotate()
:
chars = IntStream.range(0, alphabet.length())
.mapToObj(i -> StringUtils.rotate(alphabet, -i))
.map(String::toCharArray)
.toArray(char[][]::new);
或者使用 Guava 的 Chars
工具 class:
chars = Stream.generate(alphabet::toCharArray)
.limit(alphabet.length())
.toArray(char[][]::new);
IntStream.range(0, chars.length)
.forEach(i -> Collections.rotate(Chars.asList(chars[i]), -i));