使用Stream的字符串中的二维char数组

时间:2017-12-11 23:55:01

标签: java arrays java-8 java-stream chars

我即将从字符串创建二维数组:

char[][] chars;
String alphabet = "abcdefghijklmnopqrstuvwxyz";

所以数组会说明这个矩阵: enter image description here

但是我怎么能用Java 8 Streams做到这一点,因为我不想通过偶然循环来做到这一点?

2 个答案:

答案 0 :(得分:9)

糟糕的循环。他们得到了如此糟糕的说唱。我怀疑基于流的解决方案会如此清晰:

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];
}

答案 1 :(得分:2)

您可以使用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实用程序类:

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));