转载请标明出处:http://blog.csdn.net/u012250875/article/details/55126531
1.为什么写?
- comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用
- 大多数文章告诉大家comparator是用来排序,但我想说排序是comparator能实现的功能之一,他不仅限于排序
2.接口功能
该接口代表一个比较器,比较器具有可比性!大多数文章都写如何用comparator排序,是因为javase数组工具类和集合工具类中提供的sort方法sort就是使用Comparator接口来处理排序的,大家见久了都认为Comparator接口是用来排序的,按照java抽象的尿性来看,该接口如果为排序而生,应该叫Sortable,Sortor之类的名字吧!下面是javase一些使用到Comparator接口的地方:
Arrays.sort(T[],Comparator
super T> c); Collections.sort(List
list,Comparator
super T> c);
3.使用场景
4.举个栗子
talk is cheap show me the code
package com.java.demo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; / * @author puyf */ public class SortTest {
class Dog{ public int age; public String name; public Dog(int age, String name) { super(); this.age = age; this.name = name; } @Override public String toString() { return "Dog [age=" + age + ", name=" + name + "]"; } } public static void main(String[] args) { List
list=
new ArrayList<>(); list.add(
new SortTest().
new Dog(
5,
"DogA")); list.add(
new SortTest().
new Dog(
6,
"DogB")); list.add(
new SortTest().
new Dog(
7,
"DogC")); Collections.sort(list,
new Comparator
() {
@Override
public
int
compare(Dog o1, Dog o2) {
return o2.age - o1.age; } }); System.out.println(
"给狗狗按照年龄倒序:"+list); Collections.sort(list,
new Comparator
() {
@Override
public
int
compare(Dog o1, Dog o2) {
return o1.name.compareTo(o2.name); } }); System.out.println(
"给狗狗按名字字母顺序排序:"+list); } }
package com.java.demo; import java.util.ArrayList; import java.util.Comparator; import java.util.List; / * @author puyf */ public class GroupTest {
class Apple { public String color; public int weight; public Apple(String color, int weight) { super(); this.color = color; this.weight = weight; } @Override public String toString() { return "Apple [color=" + color + ", weight=" + weight + "]"; } } / * @author puyf * @Description:按条件分组 * @param datas * @param c * 是否为同一组的判断标准 * @return */ public static
List
>
divider(Collection
datas, Comparator
super T> c) { List
> result =
new ArrayList
>();
for (T t : datas) {
boolean isSameGroup =
false;
for (
int j =
0; j < result.size(); j++) {
if (c.compare(t, result.get(j).get(
0)) ==
0) { isSameGroup =
true; result.get(j).add(t);
break; } }
if (!isSameGroup) {
// 创建 List
innerList =
new ArrayList
(); result.add(innerList); innerList.add(t); } }
return result; }
public
static
void
main(String[] args) { List
list =
new ArrayList<>(); list.add(
new GroupTest().
new Apple(
"红",
205)); list.add(
new GroupTest().
new Apple(
"红",
131)); list.add(
new GroupTest().
new Apple(
"绿",
248)); list.add(
new GroupTest().
new Apple(
"绿",
153)); list.add(
new GroupTest().
new Apple(
"黄",
119)); list.add(
new GroupTest().
new Apple(
"黄",
224)); List
> byColors = divider(list,
new Comparator
() {
@Override
public
int
compare(Apple o1, Apple o2) {
// 按颜色分组
return o1.color.compareTo(o2.color); } }); System.out.println(
"按颜色分组" + byColors); List
> byWeight = divider(list,
new Comparator
() {
@Override
public
int
compare(Apple o1, Apple o2) {
// 按重量级
return (o1.weight /
100 == o2.weight /
100) ?
0 :
1; } }); System.out.println(
"按重量级分组" + byWeight); } }
5.总结
一般需要做比较的逻辑都可以使用的上Comparator,最常用的场景就是排序和分组,排序常使用Arrays和Collections的sort方法,而分组则可以使用上面提供的divider方法。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207113.html原文链接:https://javaforall.net
