【发布时间】:2021-05-30 17:28:28
【问题描述】:
我正在尝试在二维数组的特定列中搜索一个数字。我尝试了几种不同的方法,并希望在 Java 8 中使用流。但是,它似乎并不是最好的性能。想知道是否有人可以提供帮助?
boolean isInColumn(int col, int number) {
return IntStream.range(0, board.length)
.map(i -> board[i][col])
.filter(num -> num == number )
.findFirst()
.isPresent();
}
也尝试在一个块中搜索。有什么提示吗?
public boolean isInBlock(int row, int col, int number) {
int r = row - row % 3;
int c = col - col % 3;
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
if (board[i][j] == number)
return true;
}
}
return false;
}
输入数据为如下数组。
public static int[][] PUZZLE = {
{9,0,0,1,0,0,0,0,5},
{0,0,5,0,9,0,2,0,1},
{8,0,0,0,4,0,0,0,0},
{0,0,0,0,8,0,0,0,0},
{0,0,0,7,0,0,0,0,0},
{0,0,0,0,2,6,0,0,9},
{2,0,0,3,0,0,0,0,6},
{0,0,0,2,0,0,9,0,0},
{0,0,1,9,0,4,5,7,0},
};
【问题讨论】:
-
您的性能问题似乎是什么?我检查了流版本与一种天真的方式相比,差异只有几毫秒,这很可能是由于测量方式错误。然而,天真的方式总是更快。
static boolean isInColumn2(int col, int number) { for (int[] ints : PUZZLE) { if (ints[col] == number) return true; } return false; } -
@SzaPe 如果数据量会大得多,并且您需要实时处理它怎么办?即使是毫秒的差异也可能是至关重要的(当然,如果它们不是时间测量错误的结果)。
-
如果数据可能更大,您应该首先提到这一点。我用一个 30000x30000 的数组对其进行了测试,两种方法都运行了 1000 次。幼稚的方式大约快 3-4 倍
-
如果你正在做非常大的数组,那么使用
parallelStream()可能会很有趣。但请放心:对于任何低于“数千行/列”数量级的内容,朴素的老派幼稚代码将击败流式解决方案。您必须了解“流”意味着建立复杂的对象层次结构。它们为您提供易于阅读和维护的代码,如果您知道自己在做什么,可以为您提供良好的性能。但它们并不是为 Mac 性能设计的灵丹妙药!
标签: java arrays matrix search multidimensional-array