我想有以下要求的集合:插入它会检查是否已经存在具有相同名称的元素,如果有,该元素没有插入哪个集合用于排序的唯一数据集?
的元素之前
1) 2.)插入后,收集按收集人员的工资自动排序
我插入名称和工资的人作为属性。
哪个集合符合这些要求?
我想有以下要求的集合:插入它会检查是否已经存在具有相同名称的元素,如果有,该元素没有插入哪个集合用于排序的唯一数据集?
的元素之前
1) 2.)插入后,收集按收集人员的工资自动排序
我插入名称和工资的人作为属性。
哪个集合符合这些要求?
您可以使用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;
}
}
我已经检查了这个例子,但我发现没有可能性阻止相同的条目名称。薪水的订购适用于MySalaryComp。它阻止具有相同工资的条目,但那不是我想要的 – AndroidNoob
如果条目已经存在,则需要添加额外条件以返回0值。 –
更新了答案,根据第二个属性 –
那么TreeSet呢? 您可能需要使用constructor with a Comparator。
路易斯是错的!
SortedSet将是完美的。 你只需要实现Comparable接口并比较人员的工资。
对于SortedSet它可以,但是不要忘记实现接口COMPARABLE。
您可以在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);
}
}
}
没有内置的,也没有图书馆,我知道的。我能想到的最好的解决方案是维护名称的Set,以及按薪水和名称排序的单独的SortedSet。 –
我想这已经被问到了 - 你看过吗? http://stackoverflow.com/questions/7416176/how-can-i-use-a-custom-class-in-a-treeset – Charlie