0

我有两个 SQL 表。在抓取两个表后ResultSets,我将它们存储在 中String[][]s,按公共 id 列排序。这些表应该包含相同的数据,但是其中一个可能具有与另一个相同的行的重复项。为了检查表 A 中的每个String[]是否在表 B 中至少出现一次,我需要contains()String[].

这是我到目前为止所拥有的,但我很困惑(也不确定是否有更有效的解决方案)。给它源表和目标表。它获取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;
}
4

2 回答 2

3

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

对于第一个数组的每个元素,您应该定义一个found布尔变量,只有在第二个数组中找到该元素时才会将其设置为 true。一旦第二个循环结束,如果这个变量仍然是假的,你已经找到了第一个数组的一个元素不在第二个中,你可以立即返回。

当然,只要将此变量设置为 true,您就可以跳出第二个循环。

于 2012-06-04T19:59:52.663 回答
0

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

  • 使用强散列函数对每一行进行散列:这为您提供了一个整数(可能足够长)或表示整行的单个字符串/字节数组
  • 然后继续进行,就好像您正在比较两个“列表”行一样。这些“列表”中的至少一个实际上应该存储在 HashSet/HashMap 中,其 contains() 方法是有效的。

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

如果您只有少量(例如,几万)行,那么您可以使用 64 位散列码——这只是具有每个散列存储在 long 中的优点,因此它们有点更容易调整和比较。但是 64 位哈希码仅足以保证数万到数十万个对象的哈希的唯一性(=在您的情况下为不同的行)。

PS如果您准备将所有数据存储在内存中,那么您也可以将所有列连接到一个字符串中作为每行的“哈希”。诀窍是使检查有效,以将表的行表示形式之一存储在 HashSet/HashMap 中。

于 2012-06-04T20:00:41.727 回答