• Comparable接口与Comparator接口的比较————Comparator接口详解


    Comparator接口位于:java.util包中。

    Comparator接口:
    1. 强行对某个对象的Collection进行整体排序。
    值得注意的是:
    Comparator接口可以作为参数传到一些sort()方法中,例如:
    Collection.sort(List<T> list, Comparator<? super T> c)、
    Arrays.sort(T[] a, Comparator<? super T> c);

    2. Comparator接口指定的顺序,可以不是字典顺序排序,但包含字典顺序排序!!!

    现在让我们仍然对User进行排序吧!!!
    Let's do it!!!

    3. 有的人会觉得 实现Comparator接口 有点奇怪,Comparator接口中明明有两个方法: compare()、equals()
    为什么实现此接口的类只用实现compare()方法呢?
    其实稍加思索,就明白了:实现Comparator接口的类没有实现equals方法,是因为类里有equals()方法了,
    所有的类都是从基类java.lang.Object中继承的,而Object类中已经有equals()方法了,
    故而在你创建完成这个类,就已经实现了equals()方法了,是不是恍然大悟呢?!!!

    User类的代码如下:

    package test;
    
    public class User {
    
    	private String name;
    	private Integer age;
    	
    	public User(String name, Integer age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", age=" + age + "]";
    	}
    
    }
    

      看下实现Comparator接口的类UserComparator的代码:

    package test;
    
    import java.util.Comparator;
    
    public class UserComparator implements Comparator<User>{
    
    	@Override
    	public int compare(User o1, User o2) {
    		int flag = o1.getName().compareTo(o2.getName());
    		if(flag == 0) {
    			flag = o1.getAge().compareTo(o1.getAge());
    		}
    		return flag;
    	}
    
    }
    

      接着我们要进行测试了哈!UserTest.java的代码如下:

    package test;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    public class UserTest {
    	
    	public static void print(List<User> list) {
    		for(User u : list) {
    			System.out.println(u);
    		}
    	}
    	
    	public static void print(User[] array) {
    		for(int i=0; i<array.length; i++) {
    			System.out.println(array[i]);
    		}
    	}
    	
    	public static void main(String[] args) {
    		
    		List<User> users = new ArrayList<User>();
    		users.add(new User("a",12));
    		users.add(new User("C",25));
    		users.add(new User("B",12));
    		users.add(new User("A",15));
    		users.add(new User("b",19));
    		users.add(new User("c",17));
    		users.add(new User("a",22));
    		
    		User[] users2 = new User[]{
    				new User("a",12),
    				new User("C",25),
    				new User("B",12),
    				new User("A",15),
    				new User("b",19),
    				new User("c",17),
    				new User("a",22)
    		};
    		System.out.println("=========================Comparator接口的测试=========================");
    		System.out.println("List排序前:");
    		print(users);
    		
    		System.out.println();
    		System.out.println();
    		
    		System.out.println("List排序后:");
    		Collections.sort(users, new UserComparator());
    		print(users);
    		
    		System.out.println("--------------------------------------------");
    		System.out.println();
    		System.out.println();
    		System.out.println();
    		System.out.println();
    		
    		
    		System.out.println("Array排序前:");
    		print(users2);
    		
    		System.out.println();
    		System.out.println();
    		
    		System.out.println("Array排序后:");
    		Arrays.sort(users2, new UserComparator());
    		print(users2);
    		
    	}
    
    }
    

      测试的结果如下:

    =========================Comparator接口的测试=========================
    List排序前:
    User [name=a, age=12]
    User [name=C, age=25]
    User [name=B, age=12]
    User [name=A, age=15]
    User [name=b, age=19]
    User [name=c, age=17]
    User [name=a, age=22]
    
    
    List排序后:
    User [name=A, age=15]
    User [name=B, age=12]
    User [name=C, age=25]
    User [name=a, age=12]
    User [name=a, age=22]
    User [name=b, age=19]
    User [name=c, age=17]
    --------------------------------------------
    
    
    
    
    Array排序前:
    User [name=a, age=12]
    User [name=C, age=25]
    User [name=B, age=12]
    User [name=A, age=15]
    User [name=b, age=19]
    User [name=c, age=17]
    User [name=a, age=22]
    
    
    Array排序后:
    User [name=A, age=15]
    User [name=B, age=12]
    User [name=C, age=25]
    User [name=a, age=12]
    User [name=a, age=22]
    User [name=b, age=19]
    User [name=c, age=17]
    

    以上是按照字典顺序进行排序,今天想着实现一个字典顺序的倒序排序,大家一起来讨论下吧!!

    下面是UserComparator2的代码:

    package test;
    
    import java.util.Comparator;
    
    public class UserComparator2 implements Comparator<User>{
    
    	@Override
    	public int compare(User o1, User o2) {
    		int flag = 0;
    		flag = sort(o1.getName(), o2.getName());
    		if(flag == 0) {
    			flag = o1.getAge().compareTo(o2.getAge());
    		}
    		return flag;
    	}
    	
    	/*
    	 * 字典顺序的倒序排序,z是第一个,A是最后一个, 
    	 * 如果A<B,返回1
    	 * 	  A=B,返回0
    	 * 	  A>B,返回-1	
    	 */
    	public int sort(String s1, String s2) {
    		int flag = 0;
    		//获取s1、s2的字符序列
    		char[] c1 = s1.toCharArray();
    		char[] c2 = s2.toCharArray();
    		//设置循环的次数,取字符串长度小的
    		int length1 = s1.length();
    		int length2 = s2.length();
    		int longer = c1.length - c2.length;
    		int count = longer>=0 ? length2 : length1;
    		
    		for(int i=0; i<count; i++) {
    			//取出每个字符串上对应的字符,进行比较
    			char charS1 = c1[i];
    			char charS2 = c2[i];
    			
    			int result = charS1 - charS2;
    			if(result < 0) {
    				flag = 1;
    				break;
    			}else if(result > 0) {
    				flag = -1;
    				break;
    			}else {
    				flag = 0;
    			}
    		}
    		
    		//如果是这种情况:jim、jime,则jime排在前
    		if(flag == 0) {
    			if(longer < 0) {
    				//长度长的排前面
    				flag = 1;
    			}else if(longer > 0) {
    				flag = -1;
    			}else {
    				flag = 0;
    			}
    		}
    		
    		return flag;
    	}
    	
    
    }
    

      然后,让我们开始进行测试吧:

    package test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class UserTest2 {
    	
    	public static void print(List<User> list) {
    		for(User u : list) {
    			System.out.println(u);
    		}
    	}
    	
    	public static void main(String[] args) {
    		List<User> users = new ArrayList<User>();
    		users.add(new User("jim",12));
    		users.add(new User("joe",25));
    		users.add(new User("jime",12));
    		users.add(new User("tom",15));
    		users.add(new User("tom",17));
    		users.add(new User("andy",19));
    		users.add(new User("cwayi",17));
    		users.add(new User("zendy",22));
    		users.add(new User("yorick",33));
    		users.add(new User("maomi",22));
    		
    		
    		System.out.println("=========================Comparator接口的测试=========================");
    		System.out.println("List排序前:");
    		print(users);
    		
    		System.out.println();
    		System.out.println();
    		
    		System.out.println("List排序后:");
    		Collections.sort(users, new UserComparator2());
    		print(users);
    		
    		System.out.println("--------------------------------------------");
    	}
    	/*
    	 * 预想的结果应该是:
    	 * 	zendy--22
    	 *  yorick--33
    	 *  tom--15
    	 *  tom--17
    	 *  maomi--22
    	 *  joe--25
    	 *  jime--12
    	 *  jim--12
    	 *  cwayi--17
    	 *  andy--19
    	 */
    	
    }
    

      程序运行的结果如下:

    =========================Comparator接口的测试=========================
    List排序前:
    User [name=jim, age=12]
    User [name=joe, age=25]
    User [name=jime, age=12]
    User [name=tom, age=15]
    User [name=tom, age=17]
    User [name=andy, age=19]
    User [name=cwayi, age=17]
    User [name=zendy, age=22]
    User [name=yorick, age=33]
    User [name=maomi, age=22]
    
    
    List排序后:
    User [name=zendy, age=22]
    User [name=yorick, age=33]
    User [name=tom, age=15]
    User [name=tom, age=17]
    User [name=maomi, age=22]
    User [name=joe, age=25]
    User [name=jime, age=12]
    User [name=jim, age=12]
    User [name=cwayi, age=17]
    User [name=andy, age=19]
    --------------------------------------------
    

      是不是很有意思呢?!以上就是Comparator接口的学习了,快来一起学习吧!

  • 相关阅读:
    【阿里聚安全·安全周刊】苹果证实 iOS 源代码泄露|英国黑客赢下官司
    150万元重奖!阿里软件供应链安全大赛正式启动
    【阿里聚安全·安全周刊】山寨外挂有风险养蛙需谨慎|健身追踪热度图爆军事基地位置
    移动APP外挂攻防实战
    阿里云正式上线移动直播问答解决方案,助力APP尽情“撒币”!
    阿里安全资深专家杭特辣评中国网络安全人才之“怪现状”
    【阿里聚安全·安全周刊】Intel芯片级安全漏洞事件|macOS存在漏洞
    阿里聚安全年终盘点|2017互联网安全领域十大话题
    【技术分析】DowginCw病毒家族解析
    独家探寻阿里安全潘多拉实验室,完美越狱苹果iOS11.2.1
  • 原文地址:https://www.cnblogs.com/yorickLi/p/5950559.html
Copyright © 2020-2023  润新知