JAVA泛型——自定义比较器的3种方式
Posted 小乖乖的臭坏坏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA泛型——自定义比较器的3种方式相关的知识,希望对你有一定的参考价值。
方式一:实现Comparable接口,覆盖compareTo方法
import java.util.*;
class TreeSetDemo
public static void main(String[] args)
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
//ts.add(new Student("lisi007",20));
//ts.add(new Student("lisi01",40));
Iterator it = ts.iterator();
while(it.hasNext())
Student stu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
class Student implements Comparable//该接口强制让学生具备比较性。
private String name;
private int age;
Student(String name,int age)
this.name = name;
this.age = age;
public int compareTo(Object obj)
//return 0;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
return -1;
/**/
public String getName()
return name;
public int getAge()
return age;
方式二:通过实现Comparator接口,覆盖compare方法对对象完成排序属性
例子:初始化一个TreeSet类型的集合,当集合中有元素时即对集合中元素以字符串长度为规则进行排序
import java.util.*;
class GenericDemo2
public static void main(String[] args)
TreeSet<String> ts = new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator<String> it = ts.iterator();
while(it.hasNext())
String s = it.next();
System.out.println(s);
class LenComparator implements Comparator<String>
public int compare(String o1,String o2)
int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));
if(num==0)
return o2.compareTo(o1);
return num;
方式三:通过重写Collections.sort方法的Comparator对象
例子1:这是Kruskal算法中的一部分。定义一个数据类型Edge代表有向加权图的一条边,其中source代表起点,target代表重点,cost代表权值。通过比较权值cost的大小来衡量两条边谁更大。
static class Edge
public int source, target, cost;
Edge(int source, int target, int cost)
this.source = source;
this.target = target;
this.cost = cost;
//直接走一遍kruskal算法,结果就出来了
public static int kruskal(int N, Vector<Edge> edges)
...
//排序
Collections.sort(edges, new Comparator<Edge>()
@Override
public int compare(Edge o1, Edge o2)
if(o1.cost<o2.cost)return -1;
else if(o1.cost<o2.cost)return 1;
else return 0;
);
...
————————————————
版权声明:本文为CSDN博主「小乖乖的臭坏坏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42887138/article/details/122289265
例子2:定义一个数据类型EpElement类,(中间包含的Point类代表平面直角坐标系的坐标,拥有x和y两个整型)比较方式按照纵坐标进行比较
public static class EpElement
private GraghBasic.Point P;
private String direction;//left, right, bottom, top
private int id;
EpElement()
EpElement(GraghBasic.Point P, String direction, int id)
this.P = P;
this.direction = direction;
this.id = id;
public static void main(String[] args)
//定义EP表Vector容器内的基本元素
Vector<EpElement> EP = new Vector<EpElement>();
...
//自定义容器比较器
Collections.sort(EP, new Comparator<Object>()
@Override
public int compare(Object o1, Object o2)
EpElement s1 = (EpElement) o1;
EpElement s2 = (EpElement) o2;
if (s1.P.y>s2.P.y)
return 1;//返回1,就默认前者大于后者
else if(s1.P.y<s2.P.y)
return -1;
else
if(s1.P.x>s2.P.x)
return 1;
else if(s1.P.x<s2.P.x)
return -1;
else
return 0;
);
————————————————
版权声明:本文为CSDN博主「小乖乖的臭坏坏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42887138/article/details/122104241
以上是关于JAVA泛型——自定义比较器的3种方式的主要内容,如果未能解决你的问题,请参考以下文章