我有两个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;
}
答案 0 :(得分:3)
可以使用Arrays.equals()删除最内层的循环。
对于第一个数组的每个元素,您应该定义一个found
布尔变量,只有在第二个数组中找到该元素后才能将其设置为true。第二个循环完成后,如果此变量仍为false,则表示第一个数组的元素不在第二个循环中,您可以立即返回。
当然,只要此变量设置为true,就可以摆脱第二个循环。
答案 1 :(得分:0)
基本上,您通常需要执行以下操作:
对于散列函数,您可以使用MD5(例如,您可以use this code,但使用“MD5”而不是“SHA-1”)。您可以使用MessageDigest.compare()来比较表示哈希码的字节数组。
如果你只有一小部分(比方说,几万)行,那么你可以use a 64-bit hash code - 这只是有一个优点,即每个哈希存储在一个长的所以它们是一个更容易避免和比较。但是64位哈希码仅足以保证数十到数十万个对象(=你的情况下不同的行)的哈希的唯一性。
P.S。如果您准备将所有数据存储在内存中,那么您也可以使用每行的“哈希”将所有列集合在一起成为单个字符串。诀窍是使检查有效,使其中一个表的行表示存储在HashSet / HashMap中。