Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字符[]展平为字符[]?_Java_Arrays - Fatal编程技术网

Java 如何将字符[]展平为字符[]?

Java 如何将字符[]展平为字符[]?,java,arrays,Java,Arrays,我有一个多维字符数组: board = new char[3][3]; 在我的一个班级里,我代表了一个tic-tac-toe游戏,我已经初始化了它 将其展平为一个阵列的最佳方法是什么 int[][] x = { { 1, 2 }, { 3, 4 } }; int [] flatten = Arrays.stream(x) .flatMapToInt(Arrays::stream) .toArray()

我有一个多维字符数组:

board = new char[3][3];
在我的一个班级里,我代表了一个tic-tac-toe游戏,我已经初始化了它

将其展平为一个阵列的最佳方法是什么

int[][] x = { { 1, 2 }, { 3, 4 } };

int [] flatten = Arrays.stream(x)
                       .flatMapToInt(Arrays::stream)
                       .toArray();
使用流api这相当简单

如果您使用的是
char[][]

char[][] board = {
            { 'x', 'o', ' ' },
            { ' ', 'o', 'x' },
            { ' ', 'o', 'x' },
};

StringBuilder sb = Arrays.stream(board)
            .flatMapToInt(x -> IntStream.range(0, x.length).map(i -> x[i]))
            .mapToObj(x -> (char) x)
            .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);

    char[] chars = new char[sb.length()];
    sb.getChars(0, sb.length(), chars, 0);

您可以使用
新字符串(char[]data)
将每一行包装成字符串对象,而不是列表。然后您可以连接所有字符串,并在最后一个字符串上调用
toCharArray

使用Java8中添加的流进行演示

char[][] board = {
        {'x','o',' '},
        {' ','o','x'},
        {' ','o','x'},
};

char[] flatten = Arrays.stream(board)
                       .map(String::new)
                       .collect(Collectors.joining())
                       .toCharArray();

System.out.println(Arrays.toString(flatten));
输出:
[x,o,,,o,x,o,x]


但可能更有效的方法是手动创建
char[9]
并将每个“行”的内容复制到其中

char[] flatten = new char[9];
int position = 0;
for (char[] row : board) {
    System.arraycopy(row, 0, flatten, position, row.length);
    position += row.length;
}
将其展平为一个阵列的最佳方法是什么

int[][] x = { { 1, 2 }, { 3, 4 } };

int [] flatten = Arrays.stream(x)
                       .flatMapToInt(Arrays::stream)
                       .toArray();
与@Pshemo的一个示例稍有相似,但我个人同意

Stream.of(board) 
      .map(String::valueOf)
      .collect(collectingAndThen(joining(), String::toCharArray));
您不必担心性能,因为这不是一个繁重的操作,因为您总是有三个数组,每个数组只包含三个元素


所需进口:

import java.util.stream.*;
import static java.util.stream.Collectors.*;

我想通过
String result=Arrays.stream(board).flatMapToInt(x->IntStream.range(0,x.length).map(I->x[I]).mapToObj(x->(char)x).collect(StringBuilder::new,StringBuilder::append,StringBuilder::append).toString()
@Eugene你可能是对的,我们需要看看JIT如何将每个字符装箱到每个字符(我不专业,所以我对JIT的了解不足以讨论它)。不管怎样,你的解决方案感觉。。。不那么直观(至少对我来说),所以我可能会坚持我所拥有的。如果性能是一个问题,我可能会使用我的答案中的第二个解决方案:)我完全同意可读性方面的观点,实际上我试图提出一些更具可读性并且可以not@Eugene是的,拥有原语
char
类型的流将使它更容易。相反,我们只限于
int
s流。这不应该是处理
char[][]]
而不是
int[][][]
?“我这样说是因为我需要将它展平为一个数组”,那么你的问题应该从一开始就与之相关:)请允许我编辑它。