HashSet允许重复 [英] HashSet allows duplicates

查看:142
本文介绍了HashSet允许重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法获得 HashSet 实例按预期工作。我使用的代码如下:

  import testing.Subclass; 
import java.util.HashSet;

public class tester {
public static void main(String [] args)throws异常{
HashSet< Subclass> set = new HashSet< Subclass>();
set.add(new Subclass(007812));
set.add(new Subclass(007813));
System.out.println(Set size+ set.size());
set.add(new Subclass(007812));
System.out.println(Set size+ set.size());

for(Subclass sub:set){
System.out.println(sub acctNbr+ sub.getAcctNbr());
}
}
}

子类

  public class子类实现Comparable< Subclass> {

public Subclass(String acctNbr){
this.acctNbr = acctNbr;
}
private String acctNbr;
public String getAcctNbr(){
return this.acctNbr;
}
public int compareTo(Subclass other){
return this.getAcctNbr()。compareTo(other.getAcctNbr());
}

public boolean equals(Subclass other){
if(other.getAcctNbr()。equals(this.getAcctNbr()))
return true;
else
返回false;
}
public int hashCode(){
return acctNbr.hashCode();
}
}

此代码输出

  sross @ sross-workstation:〜/ Documents $ javac testing / Subclass.java 
sross @ sross-workstation:〜/ Documents $ javac tester.java
sross @ sross-workstation:〜/ Documents $ java tester
设置大小2
设置大小3
sub acctNbr 007812
sub acctNbr 007812
sub acctNbr 007813
sross @ sross-workstation:〜/ Documents $


解决方案>

您需要覆盖 equals(Object)。而不是这样做,你已经实现了一个等于方法,具有签名 equals(Subclass)。因此,您的 HashSet 正在使用 Object equals(Object) c $ c>用于等式测试。



默认的 equals(Object)实现是基于对象标识,因此集合允许您添加两个 String ,即语义相等的对象不一样。


I can't seem to get a HashSet instance to work as expected. The code I used is as follows:

import testing.Subclass;
import java.util.HashSet;

public class tester {
  public static void main(String[] args) throws Exception {
    HashSet<Subclass> set = new HashSet<Subclass>();
    set.add(new Subclass("007812"));
    set.add(new Subclass("007813"));
    System.out.println("Set size " + set.size());
    set.add(new Subclass("007812"));
    System.out.println("Set size " + set.size());

    for(Subclass sub : set) {
      System.out.println(" sub acctNbr " + sub.getAcctNbr());
    }
  }
}

Subclass

public class Subclass implements Comparable<Subclass> {

  public Subclass(String acctNbr) {
    this.acctNbr = acctNbr;
  }
  private String acctNbr;
  public String getAcctNbr() {
    return this.acctNbr;
  }
  public int compareTo(Subclass other) {
    return this.getAcctNbr().compareTo(other.getAcctNbr());
  }

  public boolean equals(Subclass other) {
    if(other.getAcctNbr().equals(this.getAcctNbr()))
      return true;
    else
      return false;
  }
  public int hashCode() {
    return acctNbr.hashCode();
  }
}

This code outputs

sross@sross-workstation:~/Documents$ javac testing/Subclass.java
sross@sross-workstation:~/Documents$ javac tester.java
sross@sross-workstation:~/Documents$ java tester
Set size 2
Set size 3
 sub acctNbr 007812
 sub acctNbr 007812
 sub acctNbr 007813
sross@sross-workstation:~/Documents$

解决方案

You need to override equals(Object). Instead of doing this you've implemented an equals method with signature equals(Subclass). Consequently your HashSet is using the default equals(Object) method defined on Object for equality testing.

The default equals(Object) implementation is based on object identity, and hence the set "allows" you to add two Strings that, whilst semantically equal, are not the same object.

这篇关于HashSet允许重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆