• 81.Java集合之TreeMap


     TreeMap

    TreeMap的排序,TreeMap可以对集合中的键进行排序。如何实现键的排序?

    方式一:元素自身具备比较性

    和TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。

    方式二:容器具备比较性

    当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。

    注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;

    注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一直的人为相同的人,如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,以为可能姓名不同(年龄相同姓名不同的人是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.)

    通过return 0来判断唯一性。

    import java.util.TreeMap;
    
    public class Demo4 {
        public static void main(String[] args) {
            TreeMap<String, Integer> tree = new TreeMap<String, Integer>();
            tree.put("张三", 19);
            tree.put("李四", 20);
            tree.put("王五", 21);
            tree.put("赵六", 22);
            tree.put("周七", 23);
            tree.put("张三", 24);
            System.out.println(tree);
            System.out.println("张三".compareTo("李四"));//-2094
        }
    }

    自定义元素排序

    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.Map.Entry;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class Demo3 {
        public static void main(String[] args) {
            TreeMap<Person, String> hm = new TreeMap<Person, String>(
                    new MyComparator());
            hm.put(new Person("jack", 20), "1001");
            hm.put(new Person("rose", 18), "1002");
            hm.put(new Person("lucy", 19), "1003");
            hm.put(new Person("hmm", 17), "1004");
            hm.put(new Person("ll", 25), "1005");
            System.out.println(hm);
            System.out.println(hm.put(new Person("rose", 18), "1006"));
    
            Set<Entry<Person, String>> entrySet = hm.entrySet();
            Iterator<Entry<Person, String>> it = entrySet.iterator();
            while (it.hasNext()) {
                Entry<Person, String> next = it.next();
                Person key = next.getKey();
                String value = next.getValue();
                System.out.println(key + " = " + value);
            }
        }
    }
    
    class MyComparator implements Comparator<Person> {
    
        @Override
        public int compare(Person p1, Person p2) {
            if (p1.getAge() > p2.getAge()) {
                return -1;
            } else if (p1.getAge() < p2.getAge()) {
                return 1;
            }
            return p1.getName().compareTo(p2.getName());
        }
    
    }
    
    class Person implements Comparable<Person> {
        private String name;
        private int age;
    
        Person() {
    
        }
    
        public Person(String name, int age) {
    
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public int hashCode() {
    
            return this.name.hashCode() + age * 37;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Person) {
                Person p = (Person) obj;
                return this.name.equals(p.name) && this.age == p.age;
            } else {
                return false;
            }
        }
    
        @Override
        public String toString() {
    
            return "Person@name:" + this.name + " age:" + this.age;
        }
    
        @Override
        public int compareTo(Person p) {
    
            if (this.age > p.age) {
                return 1;
            } else if (this.age < p.age) {
                return -1;
            }
            return this.name.compareTo(p.name);
        }
    
    }

    注意:Set的元素不可重复,Map的键不可重复,如果存入重复元素如何处理

    Set元素重复元素不能存入add方法返回false

    Map的重复健将覆盖旧键,将旧值返回。

    author@nohert
  • 相关阅读:
    Android中Handler的使用
    Android ListView使用
    Android ListView的XML属性
    Android ListView几个重要属性
    Android设置日期DatePickerDialog
    Android资源文件说明
    Android使用xml文件中的array资源
    Android:控件Spinner实现下拉列表
    如何搭建个人博客网站(Mac)
    SVProgressHUD源码解读(2.0.3)
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13605332.html
Copyright © 2020-2023  润新知