Java 中List Map Stream排序总结
注意:compare 方法返回值含义
< return -1
= return 0
> return 1
一. List排序
- 方法:调用 List 对象的 sort 方法,传入实现了 Comparator 接口的 compare 方法的匿名类。
- 降序:compare 方法返回相反数,比如 return -o1.compareTo(o2);
public class Main {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>(){{
add("e");
add("a");
add("c");
add("f");
add("g");
}};
stringList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(stringList);
}
}
二. Map排序
2.1 按照Key排序
- 使用TreeMap来实现按照Key排序,TreeMap实现了红黑树的结构,形成了一颗二叉树,它的Key是有序的,可以自定义一个比较器
public class Main {
public static void main(String[] args) {
SortedMap<String, Integer> treeMap = new TreeMap<String, Integer>(new Comparator<String>() {
@Override
public int compare(String key1, String key2) {
return key1.compareTo(key2);
}
});
treeMap.put("d", 3);
treeMap.put("b", 1);
treeMap.put("a", 0);
treeMap.put("c", 2);
System.out.println(treeMap);
}
}
2.2 按照Value排序
- 将 Map 转换成 List<Map.Entry<String, Integer>> 结构,然后利用List的sort方法。
- 可以按照Key排序,也可以按照Value排序。
public class Main {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<>(){{
put("d", 3);
put("b", 1);
put("a", 0);
put("c", 2);
}};
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(hashMap.entrySet());
entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
System.out.println(entryList);
}
}
三. Stream排序
- 同样是实现 Comparator 接口
package org.example;
import lombok.Data;
import java.util.Comparator;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream<Person> personStream = Stream.of(new Person(9),
new Person(10),
new Person(11),
new Person(3),
new Person(8)
);
Stream<Person> sortedPerson = personStream.sorted(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result = 0;
if (o1.age < o2.age) {
result = -1;
} else if (o1.age > o2.age) {
result = 1;
}
return result;
}
});
System.out.println(sortedPerson.collect(Collectors.toList()));
}
@Data
public static class Person {
int age;
public Person(int age) {
this.age = age;
}
}
}