【java】Comparator的用途转载
原创转载请注明来源: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
3.使用场景
哪些场景需要比较,那么哪些场景是Comparator关于界面的使用,我总结了两种情况:
- 排序,需要比较位于顶部和底部的两个对象(排序也可以让类实现Comparable接口实现后,类的实例也具有排序能力)。
- 分组需要比较两个对象是否属于同一组。
- 待补充
4.举个栗子
1.排序
在List或数组中的对象(如果未实现)Comparable接口,则要求调用方对数组或List设置一个Compartor,Compartor的compare该方法用于告诉代码如何比较两个实例,然后根据比较结果对它们进行排序。
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) {
Listlist= 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);
}
}
2.分组
使用Comparator和for循环列表进行分类;Comparator界面的比较逻辑告诉程序如何比较和分组比较后的结果。例如,生活中的拳击比赛会有公斤级的概念,所以程序中应该实现的处理逻辑是,只要两个人的体重在同一范围内,他们就会是同一组公斤级选手。在下面的例子中,狗是根据它们的颜色和体重水平进行分组的,所以分组的核心逻辑实际上是比较逻辑。我画了一个工具方法:dividerList,第一个参数是要处理的数据源,第二个参数是分组时的比较逻辑。
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 staticList<List > divider(Collection datas, Comparator<? super T> c) {
List<List> result = new ArrayList<List >();
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) {
// 创建
ListinnerList = new ArrayList ();
result.add(innerList);
innerList.add(t);
}
}
return result;
}
public static void main(String[] args) {
List
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<List
@Override
public int compare(Apple o1, Apple o2) {
// 按颜色分组
return o1.color.compareTo(o2.color);
}
});
System.out.println("按颜色分组" + byColors);
List<List
@Override
public int compare(Apple o1, Apple o2) {
// 按重量级
return (o1.weight / 100 == o2.weight / 100) ? 0 : 1;
}
});
System.out.println("按重量级分组" + byWeight);
}
}
结果如下(为方便起见,手动回车和换行被格式化):
按颜色分组
[
[
Apple [color=红, weight=205],
Apple [color=红, weight=131]
],
[
Apple [color=绿, weight=248],
Apple [color=绿, weight=153]
],
[
Apple [color=黄, weight=119],
Apple [color=黄, weight=224]
]
]
按重量级分组
[
[
Apple [color=红, weight=205],
Apple [color=绿, weight=248],
Apple [color=黄, weight=224]
],
[
Apple [color=红, weight=131],
Apple [color=绿, weight=153],
Apple [color=黄, weight=119]
]
]
5.总结
一般来说,可以使用需要比较的逻辑。Comparator,最常用的场景是排序和分组,通常使用排序Arrays和Collections的sort方法,而分组可以使用divider方法。
排序和分组的区别在于:
排序时,比较两个对象有三种结果:大于、等于和小于。
分组时,比较两个对象只有两个结果:相等(两个对象属于同一组),不等于(两个对象属于不同的组
作者:puyf
来源:CSDN
原文:https://blog.csdn.net/u012250875/article/details/55126531
版权声明:本文为博主原创文章。转载请附上博客链接!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除