- TreeSet 的去重是由所add對(duì)象聲明的compareTo 決定的,而HashSet 會(huì)先去比較對(duì)象的hashcode 方法返回值,如果相同,再去比較對(duì)象的equals方法盟庞。因此一般可以通過改寫對(duì)象的hashcode 和equals方法來修改對(duì)象的判重規(guī)則吃沪。
package baidu.Javabase.comparator;
/**
* Created by liuchaoqun01 on 18/6/9.
*/
public class Person implements Comparable {
private String name;
private Integer age;
private String mind;
public Person(String name, Integer age, String mind) {
this.name = name;
this.age = age;
this.mind = mind;
}
/**
* 比較方法在類中聲明,一般是傳入一個(gè)類和當(dāng)前類比較
* @param o
* @return
*/
public int compareTo(Object o) {
Person person = (Person) o;
int ret = this.name.compareTo(person.getName());
if (ret == 0) {
ret = Integer.compare(this.age, person.getAge());
}
if (ret == 0) {
return this.getMind().compareTo(person.getMind());
}
return ret;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getMind() {
return mind;
}
public void setMind(String mind) {
this.mind = mind;
}
}
package baidu.Javabase.comparator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* Created by liuchaoqun01 on 18/6/9.
*/
public class TestComparable {
//生成待排序數(shù)組
private static List<Person> generatePersonList() {
List<Person> retList = new ArrayList<>(16);
retList.addAll(Arrays.asList(new Person("erMaZi", 19, "good"), new Person("liSi", 17, "bad")
, new Person("wangWu", 18, "middle")
, new Person("wangWu", 18, "middle")));
return retList;
}
public static void print(String message,List<Person> personList){
System.out.println(message+":");
for(Person p:personList){
System.out.println(p);
}
System.out.println();
}
public static void print(String message,SortedSet<Person> sortedSet){
System.out.println(message+":");
for(Person p:sortedSet){
System.out.println(p);
}
System.out.println();
}
public static void main(String[] args) {
//取數(shù)據(jù)
List<Person> personList = generatePersonList();
//排序一: 正常 這個(gè)并未指定比較器,是用的類本身的比較器
Collections.sort(personList);
print("Collections.sort(list)",personList);
//排序二:發(fā)現(xiàn)正常了
PersonComparator pc = new PersonComparator();
PersonComparator2 pc2 = new PersonComparator2();
Collections.sort(personList,pc.thenComparing(pc2)); // 這里是先按照pc排序,再按照pc2 排序
print("thenComparing",personList);
//排序三:正常
SortedSet<Person> ts = new TreeSet<>(personList);
print("TreeSet",ts);
//排序四:發(fā)現(xiàn)某個(gè)Person實(shí)例被吃掉了,因?yàn)門reeSet認(rèn)為CompareTo為0什猖,則兩個(gè)Person實(shí)例相同
SortedSet<Person> ts2 = new TreeSet<>(new PersonComparator());
ts2.addAll(personList);
print("TreeSet(Comparator)",ts2);
List<Integer> list = Arrays.asList(1, 2, 1,3,5,3);
SortedSet<Integer> it = new TreeSet<>(list);
System.out.println(it);
}
}
參考:https://blog.csdn.net/yxb_yingu/article/details/52194988