Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java集合获取重复项_Java_Collections_Set_Unique_Hashset - Fatal编程技术网

Java集合获取重复项

Java集合获取重复项,java,collections,set,unique,hashset,Java,Collections,Set,Unique,Hashset,JavaDoc将集合定义为: 不包含重复元素的集合。更正式地说,设置 不包含一对元素e1和e2,以使e1等于(e2) 为了验证这一点,我创建了一个非常简单的程序: import java.util.HashSet; public class CheckHashSet { public static void main(String[] args) { HashSet<Employee> set = new HashSet<Employee>();

JavaDoc将集合定义为:

不包含重复元素的集合。更正式地说,设置 不包含一对元素e1和e2,以使e1等于(e2)

为了验证这一点,我创建了一个非常简单的程序:

import java.util.HashSet;

public class CheckHashSet {
    public static void main(String[] args) {
        HashSet<Employee> set = new HashSet<Employee>();
        set.add(new Employee(10));
        set.add(new Employee(10));
        System.out.println(set.size());
        System.out.println(new Employee(10).equals(new Employee(10)));
    }

    private static class Employee implements Comparable<Employee> {
        private final int id;
        public Employee(int id) {
            this.id = id;
        }
        @Override
        public int compareTo(Employee o) {
            return this.id - o.id; 
        }

        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Employee) {
                return compareTo((Employee)obj)==0;
            }
            return false;
        }
    }
}
这意味着
new Employee(10).equals(new Employee(10))
返回true,而
set.add(new Employee(10));增加(新员工(10人))将对象添加两次


我的代码有什么问题?

您的
Employee
类没有重写
hashCode
——它需要这样做才能使任何基于哈希的集合工作

例如:

@Override
public int hashCode() {
    return id;
}

您的
Employee
类不会重写
hashCode
——它需要这样做才能使任何基于哈希的集合工作

例如:

@Override
public int hashCode() {
    return id;
}

你的班级在和上签署了联合合同:

请注意,每当重写
equals
方法时,通常需要重写
hashCode
方法,以便维护hashCode方法的一般约定,其中规定相等的对象必须具有相等的哈希代码。

在您的情况下,相等的对象不一定具有相等的哈希代码。这就是造成
哈希集
混乱的原因,因为拥有相同
id的
员工
可能会被放在不同的桶中,并因此被视为不平等


要修复,请重写
hashCode()
[例如,只需返回
this.id

您的类在和上查看联合契约:

请注意,每当重写
equals
方法时,通常需要重写
hashCode
方法,以便维护hashCode方法的一般约定,其中规定相等的对象必须具有相等的哈希代码。

在您的情况下,相等的对象不一定具有相等的哈希代码。这就是造成
哈希集
混乱的原因,因为拥有相同
id的
员工
可能会被放在不同的桶中,并因此被视为不平等


要解决此问题,请重写
hashCode()
[例如,只需返回
this.id

可能是您的问题
返回this.id-o.id
而是检查
返回这个。等于(o)
返回true或false。

可能是您的问题
返回这个.id-o.id
而是选择返回该值。equals(o)
返回true或false。

HashSet
基于数据结构,因此您必须重写类
Employee
中的
equals
hashCode
方法以使其正常工作


但是,您可以使用另一个不基于哈希表的
Set
实现,例如
TreeSet

HashSet
基于数据结构,因此必须重写类
Employee
中的
equals
hashCode
方法,以使其正常工作


但是,您可以使用另一个不基于哈希表的
Set
实现,例如
TreeSet

阅读:阅读:你真的在21秒内输入答案并格式化了吗?我放弃:-)这会让事情变得更好。你真的在21秒内输入答案并格式化了吗?我放弃:-)这会让事情好一点。这里面可能有什么问题。我不认为这是问题。这里面可能有什么问题。我不认为这是问题。这就是我一直在寻找的解决方案。JavaDoc提到它是因为Set接口在所有构造函数的约定以及add、equals和hashCode方法的约定上,除了从集合接口继承的约定之外,还添加了其他约定。@PC:不,这根本不是一回事。这是对集合的附加规定——aix引用的javadoc是关于集合中元素的需求。谢谢。这就是我一直在寻找的解决方案。JavaDoc提到它是因为Set接口在所有构造函数的约定以及add、equals和hashCode方法的约定上,除了从集合接口继承的约定之外,还添加了其他约定。@PC:不,这根本不是一回事。这是对集合的附加规定——aix引用的javadoc是关于集合中元素的需求。