自定義對象的集合排序
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中。