Note:
TreeSet: 1.向TreeSet中添加的元素必须是同一个类的. 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:1.自然排序2.定制排序 4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象 方法在此方法中,指明按照自定义类的哪个属性进行排序。 5.向TreeSet中添加元素时,首先按照compareTo()方法进行比较,一旦返回0.虽然仅是两个对象的此属 性值相同,但程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。 >compareTo()与hashCode()以及equals()三者保持一致!
自然排序代码示例:
@Test public void test3() { Set set = new TreeSet(); // set.add(new String("AA")); // set.add(new String("AA")); // set.add("JJ"); // set.add("GG"); // set.add("MM"); //当Person类没有实现Comparable接口时,向TreeSet中添加Person对象时,报ClassCastException set.add(new Person("CC", 23)); set.add(new Person("MM", 21)); set.add(new Person("GG", 25)); set.add(new Person("JJ", 24)); set.add(new Person("KK", 20)); set.add(new Person("DD", 20)); // set.add("AA"); for (Object str : set) { System.out.println(str); } }
结果:
Person{name='DD', age=20}
Person{name='KK', age=20}
Person{name='MM', age=21}
Person{name='CC', age=23}
Person{name='JJ', age=24}
Person{name='GG', age=25}
定制排序代码示例:
方式1:
/* * TreeSet的定制排序: * 见下面的步骤 * compare()与hashCode()以及equals()三者保持一致! * */ @Test public void test4() { //1.创建一个实现了Comparator接口的类对象 Comparator com = new Comparator() { //向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性 @Override public int compare(Object o1, Object o2) { if (o1 instanceof Customer && o2 instanceof Customer) { Customer c1 = (Customer) o1; Customer c2 = (Customer) o2; int i = c1.getId().compareTo(c2.getId()); if (i == 0){ return c1.getName().compareTo(c2.getName()); }else { return i; } } return 0; } }; //2.将此对象作为形参传递给TreeSet的构造器中 TreeSet set = new TreeSet(com); //3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象 set.add(new Customer("AA", 1003)); set.add(new Customer("BB", 1002)); set.add(new Customer("GG", 1004)); set.add(new Customer("CC", 1001)); set.add(new Customer("DD", 1001)); for (Object str : set) { System.out.println(str); } }
结果:
Customer{name='CC', id=1001}
Customer{name='DD', id=1001}
Customer{name='BB', id=1002}
Customer{name='AA', id=1003}
Customer{name='GG', id=1004}方式2:
@Test public void test5() { TreeSet set = new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Customer && o2 instanceof Customer) { Customer c1 = (Customer) o1; Customer c2 = (Customer) o2; int i = c1.getId().compareTo(c2.getId()); if (i == 0){ return c1.getName().compareTo(c2.getName()); }else { return i; } } return 0; } }); set.add(new Customer("AA", 1003)); set.add(new Customer("BB", 1002)); set.add(new Customer("GG", 1004)); set.add(new Customer("CC", 1001)); set.add(new Customer("DD", 1001)); for (Object str : set) { System.out.println(str); } }
结果:
Customer{name='CC', id=1001}
Customer{name='DD', id=1001}
Customer{name='BB', id=1002}
Customer{name='AA', id=1003}
Customer{name='GG', id=1004}