一.comparable和Comparator的区别
1、Comparable和Comparator都是用来实现集合中元素的比较、排序的。
2、Comparable是在类内部定义的方法实现的排序,位于java.lang下。
3、Comparator是在类外部实现的排序,位于java.util下。
4、实现Comparable接口需要覆盖compareTo方法,实现Comparator接口需要覆盖compare方法。
5、Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。
二.深度认识
首先Comparable这个接口是使用在你需要排序的元素类上的。
而Comparator不是使用在你需要排序的元素类上的,它需要实现一个子类对象,将子类对象传入可以排序的集合中(TreeSet)。
当你想去使用comparable接口时必须去修改源代码,因为他是建立在需要被排序的元素类上的。
那你要是想对String类进行你自己想要的排序怎么办呢?(举例子,不要抬杠)
首先你不能去修改源代码,第二String类是final类不能继承。
那么此时你就可以使用Comparator接口实现在类外的排序
三.实例
1.对元素类Node实现comparable接口
package com.cjm.lambda; import java.util.Set; import java.util.TreeSet; /** * * @author 小明 * */ public class SetSortlambda { public static void main(String[] args) { Set<Node> set = new TreeSet<>(); set.add(new Node("zs",10)); set.add(new Node("zs1",110)); set.add(new Node("zs1",10)); set.add(new Node("zszx",100)); set.add(new Node("zzxs",10)); System.out.println(set); } } /* * 元素本生实现comparator接口 */ class Node implements Comparable<Node> { int num; String str; public Node(String str,int num) { this.str=str; this.num = num; } @Override public int compareTo(Node o) { if (this.str == null) { return -1; } else { if (o.str == null) { return 1; } else { if (this.str.length() < o.str.length()) { return -1; } else { if (this.str.length() > o.str.length()) { return 1; } else { if (this.num < o.num) { return -1; } else { if (this.num > o.num) { return 1; } else { return 0; } } } } } } } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return str+num; } }
2.使用Comparator接口,实现一个Comparator接口的对象(采用内部类的方式)
package com.cjm.lambda; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; /** * Compararator接口实现排序 * * @author 小明 * */ public class Text { public static void main(String[] args) { Set<Node> set = new TreeSet<>(new Comparator<Node>() { @Override public int compare(Node node1, Node node2) { if (node1.str.length() < node2.str.length()) { return 1; } else { if (node1.str.length() > node2.str.length()) { return -1; } else { if (node1.num < node2.num) { return 1; } else { if (node1.num > node2.num) { return -1; } else { return 0; } } } } } }); set.add(new Node("zs", 10)); set.add(new Node("zs1", 110)); set.add(new Node("zs1", 10)); set.add(new Node("zszx", 100)); set.add(new Node("zzxs", 10)); System.out.println(set); } }