寻找重复算法 - Java

时间:2011-04-06 19:52:33

标签: java algorithm hashtable hashmap

我有一组值,一个arraylist,我必须找到重复的键。一种方法是使用2个循环。并遍历列表中的每个值重新排列O(n2)。

另一件事,我能做的就是将值作为键放在HashTable中。我相信,如果哈希表中已经存在相同的密钥,则会抛出异常。但它没有抛出异常

    Hashtable<String, String> ht = new Hashtable<String, String>();

    for (int i = 0; i<20; i++){
        ht.put(String.valueOf(i%10), String.valueOf(i%10));
    }

我明白错了吗?如果hastable / hashmap中已存在相同的密钥,那么它是否会抛出异常?

8 个答案:

答案 0 :(得分:5)

我的建议是,您需要HashSet而不是Hashtable

Set<String> ht = new HashSet<String>();

for (int i = 0; i<20; i++){
    if ( !ht.add(String.valueOf(i%10)) ) {
       //it already existed, throw an exception or whatever
    }
}

如果您不关心添加到地图中的,那么您几乎肯定需要Set而不是Map /表。

答案 1 :(得分:4)

不,它不会抛出异常,它只是替换旧值。您可以通过调用get来检查值是否已存在:

if (ht.get(key) != null) {
  // value already exists
}

编辑:正如@Mark Peters建议的那样,containsKey是一种更简单,有时更好的解决方案。

答案 2 :(得分:1)

您可以在API docs中看到put返回null,如果该密钥之前的表格中没有任何内容,则密钥的先前值(如果有的话)。 (在任何一种情况下都不会抛出异常。)

答案 3 :(得分:1)

您可能需要阅读performance characteristics of hashes

例如,哈希会回答“这个密钥存在吗?”的问题。快,这可能有助于您的算法。

答案 4 :(得分:1)

根据Java Docs,如果key或value为null,则可能引发的唯一异常是NullPointerException。您可以将循环更改为:

for(int i = 0 ; i < 20 ; i++) {
    if (ht.containsKey(String.valueOf(i%10)))
        throw new Something();

    ht.put(String.valueOf(i%20), True);
}

答案 5 :(得分:0)

来自JavaDoc:

放 public Object put(对象键,                   对象值) 将指定的键映射到此哈希表中的指定值。密钥和值都不能为空。 可以通过使用等于原始键的键调用get方法来检索该值。 具体说明: 放入界面Map 具体说明: 放入类词典 参数: key - 哈希表键。 价值 - 价值。 返回: 此哈希表中指定键的先前值,如果没有哈希表,则返回null。 抛出: NullPointerException - 如果键或值为null。 也可以看看: Object.equals(Object),get(Object)

看起来它会让你覆盖该值,但它会将旧值作为返回对象提供给你。

答案 6 :(得分:0)

这是最简单的方法:

List yourList;
HashSet noDuplicates = new HashSet(yourList);
HashSet duplicates = new HashSet(yourList).removeAll(noDuplicates);

答案 7 :(得分:0)

根据您的内存与运行时限制,如果您受空间限制,我会推荐一些内容:

你可以对数组进行排序(如果使用类似quicksort的东西,最坏情况为O(nlog_n)),然后遍历它以查找相邻元素中的重复项。

希望这有帮助