TreeSet:
创建 TreeSet
对象。我们可以在创建 TreeSet
对象时传入一个实现了 Comparator
接口的比较器对象,用于按照指定规则进行排序。
例如:
public int compareTo(Student s) {
if (this.score != s.score) {
return s.score - this.score;
} else {
return this.name.compareTo(s.name);
}
}
重复判定:根据比较器的比较方法来进行判定,如果比较结果为0,则是同一个对象。
*删除是通过比较器来删除,如果返回为0就开始删除。
通过比较器可以自动去重,也可用set.contains(s)来看集合中是否有于s属性值一样的对象引用。
例如:
for (int i = 0; i < 5; i++) {
String[] str = scan.next().split(",");
Student s = new Student(str[0], Integer.parseInt(str[1]));
if (!set.contains(s)) {
set.add(s);
count++;
}
}
补充:
this.name.compareTo(s.name);为字符串的comparaTo方法,比较当前对象于参数对象在字典中的位置,若当前对象在参数对象字典后,返回一个正整数。代码中用此按姓氏升序排序。
Java中的有序集合类在添加元素时就已经完成了自动排序。其中比较常见的有 TreeSet
和 LinkedHashSet
,它们都实现了 SortedSet
接口并且能够自动根据元素的顺序进行排序。 TreeSet
使用红黑树作为底层数据结构,因此可以实现快速地检索和排序;LinkedHashSet
则使用链表维护元素的插入顺序,因此可保持元素的插入顺序。
也就是说TreeSet集合在添加元素时自动调用ComparaTo方法排序和去重,无需手动排序和去重。
List:
在ArrayList集合中排序需要用到Collections.sort()方法手动排序,且若要自定义排序,需要在类中实现Comparable接口并重写compareTo方法。
若要去重可以重写equals方法并调用contains方法,如下:
Scanner scan = new Scanner(System.in);
List<Student> set = new ArrayList<>();
int count = 0;
for (int i = 0; i < 5; i++) {
String[] str = scan.next().split(",");
Student s = new Student(str[0], Integer.parseInt(str[1]));
if (!set.contains(s)) {
set.add(s);
count++;
}
}
Collections.sort(set);
System.out.println(count);
for (Student s : set) {
System.out.println(s);
}
此外,List并不会根据比较器返回值为0而去重。