当前位置: 首页 > 知识库问答 >
问题:

如何在HashSet、HashMap等中进行值比较

白博易
2023-03-14

下面是我试过的那段代码;也给出了输出。

我的问题是:我在的setter中为两个对象htd1htd2设置了相同的String值,因此Hashset中应该只允许其中一个对象(如String实现的情况)。

有人能帮助我如何使用哈希码的概念消除哈希集或任何集合中的重复吗?

public class HashSetTry {
public static void main(String[]args){
HistoryTeardownDetails htd1=new HistoryTeardownDetails();
htd1.setProcess("ashwin");
HistoryTeardownDetails htd2=new HistoryTeardownDetails();
htd2.setProcess("ashwin");

HashSet<HistoryTeardownDetails> hashSet1=new HashSet<HistoryTeardownDetails>();
System.out.println("First --> "+hashSet1);

hashSet1.add(htd1);


System.out.println("Second --> "+hashSet1);

hashSet1.add(htd2);

System.out.println("Third --> "+hashSet1);

HashSet<String> hashSet2=new HashSet<String>();

System.out.println("First --> "+hashSet2);

hashSet2.add("abc");


System.out.println("Second --> "+hashSet2);

hashSet2.add("abc");

System.out.println("Third --> "+hashSet2);

HashSet<String> hashSet3=new HashSet<String>();

String abc=new String("sakthi");

System.out.println("First --> "+hashSet3);

hashSet3.add(abc);

String abcd=new String("sakthi");

System.out.println("Second --> "+hashSet3);

hashSet3.add(abcd);

System.out.println("Third --> "+hashSet3);

}
}

输出:

First --> []
Second --> [com.ford.wqr.object.HistoryTeardownDetails@20662066]
Third --> [com.ford.wqr.object.HistoryTeardownDetails@20662066,    com.ford.wqr.object.HistoryTeardownDetails@20862086]

First --> []
Second --> [abc]
Third --> [abc]

First --> []
Second --> [sakthi]
Third --> [sakthi]

共有3个答案

费凯康
2023-03-14

HashSet.add 实际上使用内部 HashMap 的 put 方法。让我们看看HashMap.put的源代码。

386     public V put(K key, V value) {
387         if (key == null)
388             return putForNullKey(value);
389         int hash = hash(key.hashCode());
390         int i = indexFor(hash, table.length);
391         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392             Object k;
393             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
394                 V oldValue = e.value;
395                 e.value = value;
396                 e.recordAccess(this);
397                 return oldValue;
398             }
399         }
400 
401         modCount++;
402         addEntry(hash, key, value, i);
403         return null;
404     }

这里在第393行看到,如果新密钥的哈希等于任何成员哈希,那么它检查该密钥是否是相同的引用,并使用equals方法检查相等性。如果存在,则返回而不添加

秦琦
2023-03-14

重复项由对象的 equals 方法确定。

您需要重写HistoryTeardownDetails类中的等于 方法。

孟海
2023-03-14
匿名用户

  • HashSets存储唯一的元素。一个简单的规则

如果要将相等对象添加到哈希集,则前一个对象将被新对象替换。

对于最后两种情况,您使用的是字符串,已经提供了 equals哈希码方法的实现。

您需要为您自己的类提供等于hashcode,然后添加到hashset中。然后只有它会给出所需的输出

  • 如果两个对象被认为是相等的,那么它们的哈希码必须相等

我建议您为自己的类使用eclipse生成的< code>equals和< code>hashcode方法。

 类似资料:
  • 早上好, 很抱歉,如果这已经被问到了,但我正在构建一个java项目。 它是一个程序,允许用户插入投注(例如体育比赛的预测结果),并在以后允许用户插入所述比赛的最终结果。 这是由2个LinkedHashMaps完成的。一个键值对用户和预测分数,一个键值对用户和最终分数。 两个 LinkedHashMap 中键的顺序将与它们从另一个带有用户名称的数组获取键输入的顺序相同。因此,每次都只设置预测的和确定

  • 我对Java中和的内部实现有点困惑。 这是我的理解,所以如果我错了,请纠正我: < code>HashSet或< code>HashMap都不允许重复的元素。 < code>HashSet由< code>HashMap支持,所以在< code>HashSet中,当我们调用< code >时。add(element),我们在元素上调用< code>hashCode()方法,并在内部对内部< code

  • 问题内容: 我们如何排序? 我想根据中的值进行排序。 问题答案: 你是否必须使用HashMap?如果只需要Map Interface,请使用TreeMap 如果要通过比较HashMap中的值进行排序。你必须编写代码才能执行此操作,如果要执行此操作,则可以对HashMap的值进行排序: 如果你想经常访问此排序列表,则可以将元素插入到中,尽管集合和列表的语义有些不同。

  • 问题内容: 我了解这是基于实现的,但是在您需要唯一的元素集时使用。那么,为什么在下一个代码中将相同的对象放入地图并进行设置时,两个集合的大小都等于1?地图大小不应该为2吗?因为如果两个集合的大小相等,那么使用这两个集合不会有任何区别。 输出为1和1。 问题答案: 该地图拥有唯一键。当您使用映射中存在的键进行调用时,该键下的对象将被新对象替换。因此大小为1。 两者之间的区别应该很明显: 在您存储键值

  • 如果Equals方法返回false,即返回false。所以这些值应该相加两次,但只相加一次。谁能解释一下。我在谷歌上搜索并清除了关于HashCode和equals contract的概念,但在这里我失败了。

  • 我知道这个字符(:)在我的陈述中毫无意义,但我想解释一下我想要什么。我想通过添加并使用对很多哈希图进行排序,但我做不到,因为我的值返回字符串。 这是我的代码: (我想排序这个hashMap,它有值,但返回字符串。)