我用Java编写了一个程序,该程序从数据库表中检索记录并将它们存储在哈希图中。
它们的键和值如下:
Key(represent words) Values(represent filename)
w1 file1
w2 file1
w3 file2
w4 file1
w5 file2
w6 file1,file2
............
这个列表不停地在不断,但这只是它的外观而已。您可以看到,单词没有重复,而且是唯一的。
鉴于我有此哈希图信息,我需要找到键和下一个键的交点并返回交点的结果。这个主意看起来像这样:
w1∩w2= file1
w2∩w3= empty
w3∩w4= empty
....并且一直持续到哈希表中的最后一对密钥完成为止。
由于这对交集的结果取决于哈希图中的键的数量,所以我猜我需要使用一些循环来使其迭代以返回所有结果。
是否有一种方法来获取每个后续键的交集,并且有一种无论哈希图大小如何都可以优化的方法?
我很感谢任何建议。
答案 0 :(得分:1)
制作一个变量,以保存所有这些交点。在循环中一次检索2个键。比较两个键的每个值,如果它们相同,则将值添加到您的交集持有人。重复这些步骤,直到没有更多的配对为止。
这是代码。
将此添加到您的尝试/捕获下方
LinkedHashmap<String, Set<String>> intersectionMap = new LinkedHashmap<>();
if (map.keySet() != null) {
String[] keys = map.keySet().toArray(new String[map.keySet().size()]);
for (int i = 0; i < keys.length - 1; i++) {
String key1 = keys[i];
String key2 = keys[i + 1];
TreeSet<String> interSection = intersection(map.get(key1), map.get(key2));
intersectionMap.put(key1 + "∩" + key2, interSection);
}
}
添加此帮助程序方法。此方法将找到两个集合的交集。这将是解决问题的关键。
public static TreeSet<String> intersection(TreeSet<String> setA, TreeSet<String> setB) {
// An optimization to iterate over the smaller set
if (setA.size() > setB.size()) {
return intersection(setB, setA);
}
TreeSet<String> results = new TreeSet<>();
for (String element : setA) {
if (setB.contains(element)) {
results.add(element);
}
}
return results;
}
答案 1 :(得分:0)
又一个具有设置操作的版本:
Map<String>, Set<String>> intersections(Map<String, TreeSet<String>> map) {
Map<String>, Set<String>> result = new TreeMap<>();
List<String> words = new ArrayList<>(map.keySet());
words.sort();
for (int i = 0; i < words.size() - 1; ++i) {
String wordI = words.get(i);
Set<String> valueI = map.get(wordI);
for (int j = i + 1, j < words.size(); ++j) {
String wordJ = words.get(j);
Set<String> valueJ = map.get(wordJ);
String word = wordi + "∩" + words[j];
Set<String> value = new TreeSet<>(valueI);
value.retainAll(valueJ);
result.put(word, value);
}
}
return result;
}