使用String [] []模拟包含()

时间:2012-06-04 19:52:10

标签: java

我有两个SQL表。抓取ResultSets中的两个表后,我将它们存储在String[][]s中,按公共ID列排序。这些表应包含相同的数据,但是一个表可能与另一个表具有相同行的副本。为了检查表A中的每个String[]是否在表B中至少出现一次,我需要为contains()构建一个有效的String[] - esque方法。

这是我到目前为止所做的,但我很难过(也不确定是否有更有效的解决方案)。给它源表和目标表。它需要源表中的每个String[]并且(应该)遍历目标表中的每个String[],并在目标String[]中的某处找到源String[][]的实例。检查是否至少有一个String[]与元素原始String[]匹配。任何人都能指出我正确的方向和/或填补空白吗?这不是家庭作业或任何作业,我正在重构一些代码并且正在进行大脑屁。谢谢!

    public boolean targetContainsSource(String[][] s, String[][] t) {
    boolean result = true;

    //For each String[] in String[][] s
    for (int i = 0; i < s.length; i++) {

        //For each String[] in String[][] t
        for (int j = 0; j < t.length; j++) {

            //For each String in t's String[]
            for (int k = 0; k < t[0].length; k++) {
                if (!s[i][k].equals(t[j][k])) {

                }
            }
        }
    }

    return result;
}

2 个答案:

答案 0 :(得分:3)

可以使用Arrays.equals()删除最内层的循环。

对于第一个数组的每个元素,您应该定义一个found布尔变量,只有在第二个数组中找到该元素后才能将其设置为true。第二个循环完成后,如果此变量仍为false,则表示第一个数组的元素不在第二个循环中,您可以立即返回。

当然,只要此变量设置为true,就可以摆脱第二个循环。

答案 1 :(得分:0)

基本上,您通常需要执行以下操作:

  • 使用强哈希函数来获取每行的哈希:这会给你一个整数(可能很长就足够强)或单个字符串/字节数组代表整行
  • 然后继续进行,就像比较行的两个“列表”一样。这些“列表”中至少有一个实际上应该存储在HashSet / HashMap中,其contains()方法是有效的。

对于散列函数,您可以使用MD5(例如,您可以use this code,但使用“MD5”而不是“SHA-1”)。您可以使用MessageDigest.compare()来比较表示哈希码的字节数组。

如果你只有一小部分(比方说,几万)行,那么你可以use a 64-bit hash code - 这只是有一个优点,即每个哈希存储在一个长的所以它们是一个更容易避免和比较。但是64位哈希码仅足以保证数十到数十万个对象(=你的情况下不同的行)的哈希的唯一性。

P.S。如果您准备将所有数据存储在内存中,那么您也可以使用每行的“哈希”将所有列集合在一起成为单个字符串。诀窍是使检查有效,使其中一个表的行表示存储在HashSet / HashMap中。