哪个集合用于排序的唯一数据集?

时间:2016-02-29 16:50:11

标签: java collections

我想要一个具有以下要求的Collection:

1。)在插入元素之前,它检查是否已经存在具有相同名称的元素,如果有,则不插入元素

2。)插入后,集合会自动按集合中人员的工资进行排序

我插入名字和工资的人作为属性。

哪个系列符合这些要求?

5 个答案:

答案 0 :(得分:1)

TreeSet怎么样? 您可能需要使用constructor with a Comparator

答案 1 :(得分:0)

路易斯错了!

SortedSet将是完美的。 您只需要实现Comparable接口并比较人员的工资。

答案 2 :(得分:0)

您可以使用TreeSet并实现Comparator来对所需的proprty进行排序。看到 this样本。

要丢弃重复条目,您需要返回0值;

    public int compare(Empl e1, Empl e2) {
        if(e1.getName().equals(e2.getName())) {
            return 0;
        }else if(e1.getSalary() > e2.getSalary()){
            return 1;
        }else if(e1.getSalary() == e2.getSalary() && (e1.getName().compareTo(e2.getName()) > 1)) {
             return 1; // if the salary is equal, sort it based on name.
        }
        else {
            return -1;
        }

    }

答案 3 :(得分:0)

对于SortedSet会很好,但不要忘记实现接口COMPARABLE。

答案 4 :(得分:0)

您可以在HashSet上使用TreeSet,但Person必须实现Comparable接口(int compareTo(Person o)方法)并覆盖equals和hashCode方法以仅基于name字段检查identity / unique。 首先创建Person并实现/覆盖方法:

public class Person implements Comparable<Person> {

    public Person(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public Person() {
    }        

    private String name;
    private Double salary;    

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    } 

    @Override
    public String toString() {
        return "Person{" + "name=" + name + ", salary=" + salary + '}';
    }        

    public int compareTo(Person o) {        
        return salary.compareTo(o.getSalary());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + (this.name != null ? this.name.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Person other = (Person) obj;
        if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
            return false;
        }
        return true;
    }            
}

然后创建一个HashSet并用Person元素填充它。该集合将仅包含具有唯一name属性的元素,这通过仅使用equals和hashCode方法中的name字段来完成。 要保持集合排序 - 使用参数化构造函数创建TreeSet - 新的TreeSet(集合coll),您已经使用唯一元素填充了集合,因此排序将在TreeSet初始化期间进行。

以下是片段的其余部分

public class TestPerson {

    public static void main(String [] args){

    Person p1 = new Person("first", 1000);
    Person p2 = new Person("second", 2000);
    Person p3 = new Person("third", 3000);
    Person p4 = new Person("first", 4000);
    Person p5 = new Person("second", 5000);

    TreeSet<Person> personSet = new TreeSet<Person>();
    personSet.add(p1);
    personSet.add(p2);
    personSet.add(p3);
    personSet.add(p4);
    personSet.add(p5);
        for (Person person : personSet){                    
            System.out.println(" === person element sorted : "+person);
        }    

    HashSet<Person> personHashSet = new HashSet<Person>();
    personHashSet.add(p1);
    personHashSet.add(p2);
    personHashSet.add(p3);
    personHashSet.add(p4);
    personHashSet.add(p5);

    TreeSet<Person> treePersonSet  = new TreeSet<Person>(personHashSet);
        for (Person person : treePersonSet){                    
            System.out.println(" === person element: "+person);
        }    
    }
}