Java中如何检查一个多维数组中是否存在某个值?

4

没有for循环,有没有其他方法来查看一个值是否存在于多维数组中?我找到了一个示例:

 Arrays.asList(*ArrayName*).contains(*itemToFind*)

但那只会搜索数组的第一个维度,我需要搜索两个维度。


5
使用循环有什么问题?即使contains()内部也使用循环。 - Ted Hopp
2
递归会起作用 :) - zgc7009
1
@zgc7009 更好的方法是将数组序列化为XML,然后搜索文本。XML让一切变得更好 :-) - SJuan76
@Ted,如果可能的话,我只是想节省一些时间。 - user2956947
@zgc,我该如何使用递归?在确定要检查哪一行之前,我必须知道该行是否包含该值,对吗? - user2956947
@sJuan,我以前没有使用过XML。 - user2956947
3个回答

2
我已经创建了一个二维数组,包含 5 行和 5 列。该数组是一种 int 类型,并设置了一个值为i * j。 已经存在一个方法,可以接受行数和要搜索的值。
private static Integer[][] myarray = new Integer[5][5];

public static boolean exists(int row, int value) {
    if(row >= myarray.length) return false;
    List<Integer> rowvalues = Arrays.asList(Arrays.asList(myarray).get(row));
    if(rowvalues.contains(value)) return true;
    return exists(row+1, value);
}

@DwB 我的意思并不是说这比循环更好,只是另一种选择。 - deanosaur
它确实有效,尽管它没有回答问题,但也许答案是不可能的。如果在几天内我没有看到更可行的替代方案,我会选择你的方案。 - user2956947

1

如果你愿意费心理解递归的逻辑,你几乎可以做任何事情。在这种情况下,这并不太难。

private boolean checkForValue(int val, int row, int col){
    if(row == numRows && col == numCols) 
        return false;
    else{
        if(values[row][col] == val)
            return true
        else if(col < (numCols - 1))
            checkForValue(val, row, col + 1);
        else
            checkForValue(val, row + 1, 1);
    }
}

然而,如果你只是想节省时间,我认为for循环确实是一个非常高效的开始

private boolean checkForValue(int val){
    for(int i = 0; i < numRows; i++){
        for(int j = 0; j < numCols; j++){
            if(values[i][j] == val) return true;
        }
    }
    return false; //it will reach here if return true was not called.
}

两者都不太粗糙。


0

可以。

您可以使用布隆过滤器(http://en.wikipedia.org/wiki/Bloom_filter)或为数组键创建基于树的索引,例如 Trie(http://en.wikipedia.org/wiki/Trie

基本上,您需要一个数据结构来查找值,而不是键。这不会占用太多空间或速度,因为您可以在两个数据结构(您的和您选择的数据结构)中重复使用值对象的引用。


不确定如何开始数据结构。我应该使用Java字典吗? - user2956947
好吧,从数据库的角度来思考。数据库不像数组一样通过位置索引访问元素。它们使用第二个数据结构(例如主键)来帮助查找所需的行。我在这里建议的是,既然你不想使用位置数组,那么你可以引入一个辅助结构,它将作为你的数组的索引。无论如何,你的问题是“是否可能?”答案是“是的”。 - Alexandre Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接