Java 集合類型排序

自定義對象的集合排序


public class Person
{
    Integer age;
    String name;

    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

1.Collections.sort()

1.使用Collections的sort方法,可以使用兩種方法實現方式。
方法1,使用匿名內部類。當然,定義一個類A實現Comparator類,然後new A代替匿名內部類也是可以的。

    public static void main(String[] args)
    {
       ArrayList<Person> myarr = new ArrayList<>();
       Person p1 = new Person(100,"zhangsan");
       Person p2 = new Person(20,"lisi");
        Person p3 = new Person(45,"wangwu");
       myarr.add(p1);myarr.add(p2);myarr.add(p3);
      Collections.sort(myarr, new Comparator<Person>()
        {
            @Override
                    public int compare(Person o1,Person o2)
            {
                return o1.age-o2.age;
            }
         });
      System.out.println(myarr);
    }

方法2,定義一個類,實現Comparator接口,重寫compare方法,作用相當於匿名內部類。

// 1. 定義類實現 Comparator接口
class mycompare implements Comparator<Person>
{
    @Override
    public int compare(Person o1, Person o2) {
        return o1.age - o2.age;
    }
}
// 2.調用

       ArrayList<Person> myarr = new ArrayList<>();
       Person p1 = new Person(100,"zhangsan");
       Person p2 = new Person(20,"lisi");
        Person p3 = new Person(45,"wangwu");
       myarr.add(p1);myarr.add(p2);myarr.add(p3);

        Collections.sort(myarr,new mycompare());

2.在類定義的時候,實現Comparable接口,重寫compareTo方法
在定義Person的代碼中 修改如下:

//1. 實現Comparable接口
 class Person implements Comparable<Person>

//2. 重寫compareTo方法
      @Override
    public int compareTo(Person o) {
        return this.age-o.age;
    }
//3.  工具類排序
 Collections.sort(myarr);
 // [Person{age=20, name='lisi'}, Person{age=45, name='wangwu'}, Person{age=100, name='zhangsan'}]

Java內置的對象類型排序

    public static void main(String[] args)
    {
       ArrayList<String> myarr = new ArrayList<>();
        myarr.add("bb");
        myarr.add("aa");
        myarr.add("dd");
        myarr.add("cc");
      Collections.sort(myarr);
      System.out.println(myarr);
      //[aa, bb, cc, dd]
    }

爲什麼這裏我們使用工具類時並沒有繼承Comparator類也沒有實現Comparable接口默認就排序了?
原因是:
String和Intger之類的在定義的時候已經有實現Comparable接口了

在這裏插入圖片描述
在這裏插入圖片描述

HashMap 實現排序

把鍵值一起拿出來,放到list。

 Map<Integer,Integer> mp = new HashMap<>();
        mp.put(1,44);
        mp.put(2,33);
        mp.put(3,22);
        mp.put(4,11);

        List<Map.Entry<Integer,Integer>> ls = new ArrayList<Map.Entry<Integer,Integer>>(mp.entrySet());
        ls.sort(new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o1.getKey()-o2.getKey();
            }
        });
       /* Collections.sort(ls, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getKey()-o1.getKey();
            }
        });*/
        System.out.println(ls.toString());
        Map<Integer,Integer> mp1 = new LinkedHashMap<>();

        for(int i=0;i<ls.size();i++)
        {
            Map.Entry<Integer,Integer> en = ls.get(i);
            mp1.put(en.getKey(),en.getValue());
        }
        System.out.println(mp1);

另外還可以單獨把鍵拿出來,放到list,或者如果根據值排序的話,就把值拿出來,放到list排序完放到linkedhashmap中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章