2016-02-29 56 views
0

我想有以下要求的集合:插入它会检查是否已经存在具有相同名称的元素,如果有,该元素没有插入哪个集合用于排序的唯一数据集?

的元素之前

1) 2.)插入后,收集按收集人员的工资自动排序

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

哪个集合符合这些要求?

+1

没有内置的,也没有图书馆,我知道的。我能想到的最好的解决方案是维护名称的Set,以及按薪水和名称排序的单独的SortedSet。 –

+0

我想这已经被问到了 - 你看过吗? http://stackoverflow.com/questions/7416176/how-can-i-use-a-custom-class-in-a-treeset – Charlie

回答

0

您可以使用TreeSet并实现比较器来排序所需的特性。请参阅 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; 
     } 

    } 
+0

我已经检查了这个例子,但我发现没有可能性阻止相同的条目名称。薪水的订购适用于MySalaryComp。它阻止具有相同工资的条目,但那不是我想要的 – AndroidNoob

+0

如果条目已经存在,则需要添加额外条件以返回0值。 –

+0

更新了答案,根据第二个属性 –

0

路易斯是错的!

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

0

对于SortedSet它可以,但是不要忘记实现接口COMPARABLE。

0

您可以在HashSet上使用TreeSet,但Person必须实现Comparable接口(int compareTo(Person o)方法)并重写equals和hashCode方法来检查仅基于名称字段的身份/唯一性。 首先创建一个Person和实现/ overrride方法:

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,并与人的元素填充它。该集合将仅包含具有唯一名称属性的元素,这是通过在equals和hashCode方法中仅使用名称字段完成的。 为了保持集合排序 - 使用参数化构造函数创建TreeSet - 新的TreeSet(Collection 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); 
     }  
    } 
}