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种方式的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶泛型和多线程

java泛型

STL 优先队列的自定义比较函数与 sort() 等泛型算法的自定义比较函数的区别

JAVA泛型的使用(超详细)

Java泛型方法

从零开始的Java开发1-6-2 泛型:概述泛型作为方法参数自定义泛型自定义泛型方法