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[][][]
?“我这样说是因为我需要将它展平为一个数组”,那么你的问题应该从一开始就与之相关:)请允许我编辑它。