我有一组值,一个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中已存在相同的密钥,那么它是否会抛出异常?
答案 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)),然后遍历它以查找相邻元素中的重复项。
希望这有帮助