Java基础巩固系列 TreeSet

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}

猜你喜欢

转载自blog.csdn.net/Peter__Li/article/details/88981980
今日推荐