Set:无序,元素不可以重复
|——HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
若相同,会继续判断元素的equals方法是否为true。
|——TreeSet:
特点:可以对Set集合中的元素尽行排序。
TreeSet要求是向里面存的对象必须具备比较性。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法的返回值。
返回1,更大,往右边放(二叉树中);返回0,相等(/比较次要条件);返回-1,更小,往左边放。
20
18 22
16 19 21 23
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
此种方法也称为元素的自然顺序或默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
在集合初始化时,就具备比较方式,需参与集合的构造函数部分。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时以比较器为主。
定义比较器:定义一个类,实现Comparator接口,覆盖compare方法。
|——HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
若相同,会继续判断元素的equals方法是否为true。
|——TreeSet:
特点:可以对Set集合中的元素尽行排序。
TreeSet要求是向里面存的对象必须具备比较性。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法的返回值。
返回1,更大,往右边放(二叉树中);返回0,相等(/比较次要条件);返回-1,更小,往左边放。
20
18 22
16 19 21 23
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
此种方法也称为元素的自然顺序或默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
在集合初始化时,就具备比较方式,需参与集合的构造函数部分。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时以比较器为主。
定义比较器:定义一个类,实现Comparator接口,覆盖compare方法。
注意:Comparator接口中是compare方法;Comparable接口中是compareTo方法。
import java.util.*; /* *需求: *往TreeSet集合中存储自定义对象学生。 *按照学生年龄进行排序。 *排序时当主要条件相同则判断次要条件。 */ class TreeSetDemo { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { TreeSet ts = new TreeSet(); /*ts.add("abcd"); ts.add("bcde"); ts.add("cdef"); ts.add("acde");*/ ts.add(new Student("lisi03",21)); ts.add(new Student("lisi04",22)); ts.add(new Student("lisi05",21)); ts.add(new Student("lisi02",20)); ts.add(new Student("lisi01",19)); Iterator it = ts.iterator(); while(it.hasNext()) { //sop(it.next()); Student stu = (Student)it.next(); sop(stu.getName()+"...."+stu.getAge()); } } } class Student implements Comparable { //接口Comparable强制让Student类具备比较性 private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } //符合此接口,底层自动会调用 public int compareTo(Object obj) { //继承接口后需要覆盖方法 if(!(obj instanceof Student)) //首先判断Object是否为Student throw new RuntimeException("Not Student!"); Student s = (Student)obj; //然后强转 sop(this.name+"...compareto..."+s.name); if(this.age>s.age) return 1; if(this.age==s.age) { return this.name.compareTo(s.name); //this.name和s.name均是字符串 //compareTo是String类中的方法,按字典顺序比较两个字符串。 } return -1; } public String getName() { return name; } public int getAge() { return age; } public static void sop(Object obj) { System.out.println(obj); } }
import java.util.*; /* *当元素自身不具备比较性或具备的比较性不是所需的, *需要让容器自身具备比较性。 *定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 */ class TreeSetDemo2 { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { TreeSet ts = new TreeSet(new MyCompare()); ts.add(new Student("lisi03",21)); ts.add(new Student("lisi02",21)); ts.add(new Student("lisi01",25)); ts.add(new Student("lisi04",23)); ts.add(new Student("lisi01",21)); Iterator it = ts.iterator(); while(it.hasNext()) { Student stu =(Student)it.next(); System.out.println(stu.getName()+"...."+stu.getAge()); } } } class Student implements Comparable { //该接口强制的让学生具备比较性 private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Object obj) { if(!(obj instanceof Student)) throw new RuntimeException("Not Student!"); Student s = (Student)obj; //sop(this.name+"...compareto..."+s.name); if(this.age>s.age) return 1; if(this.age==s.age) { return this.name.compareTo(s.name); //compareTo是String类中的方法,按字典顺序比较两个字符串。 } return -1; } public String getName() { return name; } public int getAge() { return age; } public static void sop(Object obj) { System.out.println(obj); } } class MyCompare implements Comparator { public int compare(Object o1,Object o2) { if(!((o1 instanceof Student)&&(o2 instanceof Student))) { throw new RuntimeException("Not Student!"); } Student s1 = (Student)o1; Student s2 = (Student)o2; int num = s1.getName().compareTo(s2.getName()); if(num>0) return 1; if(num == 0) //return s1.getAge()-s2.getAge(); return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); return -1; } }
import java.util.*; class TreeSetTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { TreeSet ts = new TreeSet(new StrLenComparator()); ts.add("abcde"); ts.add("cc"); ts.add("zya"); ts.add("aaa"); ts.add("hahe"); Iterator it = ts.iterator(); while(it.hasNext()) { //StrLenComparator slc = (StrLenComparator)it.next(); sop(it.next()); } } } class StrLenComparator implements Comparator { public int compare(Object o1,Object o2) { String s1 = (String)o1; String s2 = (String)o2; int num = s1.length()-s2.length(); if(num==0) //当字符串长度相同 return s1.compareTo(s2); return num; //return new Integer(s1.length()).compareTo(new Integer(s2.length())); } }
import java.util.*; class TreeSetTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { TreeSet ts = new TreeSet(new Comparator() { //定义成匿名内部类 public int compare(Object o1,Object o2) { String s1 = (String)o1; String s2 = (String)o2; int num = s1.length()-s2.length(); if(num==0) return s1.compareTo(s2); return num; //return new Integer(s1.length()).compareTo(new Integer(s2.length())); } } ); ts.add("abcde"); ts.add("cc"); ts.add("zya"); ts.add("aaa"); ts.add("hahe"); Iterator it = ts.iterator(); while(it.hasNext()) { //StrLenComparator slc = (StrLenComparator)it.next(); sop(it.next()); } } }