【java】Comparator的用途转载

原创
小哥 3年前 (2022-11-11) 阅读数 37 #大杂烩

转载请注明来源: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.使用场景
哪些场景需要比较,那么哪些场景是Comparator关于界面的使用,我总结了两种情况:

  1. 排序,需要比较位于顶部和底部的两个对象(排序也可以让类实现Comparable接口实现后,类的实例也具有排序能力)。
  2. 分组需要比较两个对象是否属于同一组。
  3. 待补充

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) {
    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);
}
}

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 static List<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) {
    // 创建
    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<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<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);
}
}

结果如下(为方便起见,手动回车和换行被格式化):
按颜色分组
[
[
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
版权声明:本文为博主原创文章。转载请附上博客链接!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门