zoukankan      html  css  js  c++  java
  • Comparable接口与Comparator接口的比较————Comparable接口详解

    Comparable接口位于:java.lang包中。

    Comparable接口:
      1. 实现了这个接口的类,会被强制进行自然排序。
        问题又来了:那什么是自然排序呢?
          自然排序:就是字典序排序,不分大小写。例如:a、A都排在b、B之前。
        做个简单的测试吧:
        现在有个需求,需要让你把用户进行自然排序。So,亲爱的小伙伴们,这应该
        怎么做呢?
        思路:创建一个用户类(User),且此类实现了Comparable接口,然后进行测试。
        记住了呦:
          Collections.sort();可以对列表进行排序。
          Arrays.sort();可以对数组进行排序哦。
        嘿嘿,Let's do a test!

      下面是User类的代码:

     package test;

    public class User implements Comparable<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 + "]";
    	}
    
    	/*
    	 * 先比较name,
    	 * 		大于,返回1
    	 * 		等于,接着比较age
    	 * 			age:大于,返回1
    	 * 				等于,返回0
    	 * 				小于,返回-1
    	 * 		小于:返回-1
    	 * (non-Javadoc)
    	 * @see java.lang.Comparable#compareTo(java.lang.Object)
    	 */
    	@Override
    	public int compareTo(User o) {
    		int flag = 0;
    		flag = this.getName().compareTo(o.getName());
    		if(flag == 0) {
    			flag = this.getAge().compareTo(o.getAge());
    			return flag;
    		}else {
    			return flag;
    		}
    	}
    
    }

      下面是做测试的代码UserTest:

    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));
    		
    		System.out.println("排序前:");
    		print(users);
    		
    		System.out.println();
    		System.out.println();
    		
    		System.out.println("排序后:");
    		Collections.sort(users);
    		print(users);
    		
    		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("排序前:");
    		print(users2);
    		
    		System.out.println();
    		System.out.println();
    		
    		System.out.println("排序后:");
    		Arrays.sort(users2);
    		print(users2);
    	}
    
    }
    

      小伙伴们想一下,程序运行的结果应该是什么?

      哈哈,结果应该是:

       A 15
       B 12
       C 25
       a 12
       a 22
       b 19
       c 17

     
    可能有的小伙伴想的是:
       a 12
       A 15
       a 22
       B 12
       b 19
       c 17
       C 25 
     
    嘿嘿,上面的结果,也是我第一次考虑出的结果,程序运行后得到并不一样怎么办?哪里有错呢?看了几遍,感觉命名没错哈?!No, 还是有错,并不是代码有错哦,而是你出错了!
    嘿嘿,请小伙伴仔细看User中的compareTo方法:
        在compareTo方法中的第二行:flag = this.getName().compareTo(o.getName()); 这句话就是罪魁祸首,还真是可恶啊!!!该死,嘻嘻!
        有没有小伙伴看出什么的呢?
        好啦,flag = this.getName().compareTo(o.getName());这句话中也有compareTo方法,在api中找到String的compareTo(String)方法,小编发现了一个重大新闻、重大新闻、重大新闻!!!
        重要的事情说三遍:String的compareTo(String)方法中有这个说明:
          按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
          按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
          按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
        这意味着什么呢?意味着:字符串的排序虽是字典顺序排序,但是大小写有分别。A的Unicode值在a的Unicode前面,所以A排在a的前面咯。
        所以这个问题就解决了。
        String的compareTo(String)方法的下面,还有一个让小编看了特兴奋的方法!!!是什么呢?哈哈,是compareToIgnoreCase(String)方法啦。
        从方法的名字就能理解:使用这个方法进行比较字符串时,忽略、忽略、忽略大小写,哈哈!!!
        当然,这只是小编的猜想,具体是什么作用?还是得看实际的结果对吧!测试的结果如下:
    User [name=a, age=12]
    User [name=A, age=15]
    User [name=a, age=22]
    User [name=B, age=12]
    User [name=b, age=19]
    User [name=c, age=17]
    User [name=C, age=25]
    

      是不是和之前的猜想一样呢!哈哈,今天Comparable接口就到这里了,ByeBye!!!

  • 相关阅读:
    Eclipse安装反编译插件
    关于eclipse发送到桌面快捷方式后打不开
    字符串 242.有效的字符异位词
    栈 503.下一个更大的元素
    eclipse导入jar包
    Java获取当前的时间
    链表 24.两两交换链表中的节点
    链表 19.删除链表倒数第N个节点
    共享空间的栈
    栈的顺序存储结构
  • 原文地址:https://www.cnblogs.com/yorickLi/p/5950553.html
Copyright © 2011-2022 走看看