1.内部比较器
实现类为Card类,继承compareable接口重写compare方法。
public class Card implementsComparable
<Card>{ private int num; private int type; @Override public int compareTo(Card o) { //扑克牌数字相同按照花色比较,用1234表示花色,从小到大排序。 return this.num-o.num!=0?this.num-o.num:this.type-o.type; } public Card(int num, int type) { super(); this.num = num; this.type = type; } @Override public String toString() { return "Card [num=" + num + ", type=" + type + "]"; } }
测试
public class 比较器 { public static void main(String[] args) { Vector<Card> vector=new Vector<>(); vector.add(new Card(7, 4)); vector.add(new Card(1, 1)); vector.add(new Card(3, 2)); vector.add(new Card(7, 3)); vector.add(new Card(3, 1)); Collections.sort(vector);//使用内部比较器 for (int i = 0; i < vector.size(); i++) { System.out.println(vector.get(i).toString()); } } }
结果:变得有序了
Card [num=1, type=1]
Card [num=3, type=1]
Card [num=3, type=2]
Card [num=7, type=3]
Card [num=7, type=4]
结论:内部比较器可以按照自己的方式进行排序,但是缺点就是会入侵类。不够优雅。
2.外部比较器。
新建一个类作为比较器,实现接口comparetor
public class MyComparetor implements Comparator<Card>{ @Override public int compare(Card o1, Card o2) { // if(o1.getNum()!=o2.getNum()){ // return o1.getNum()-o2.getNum(); // }else // return o1.getType()-o2.getType(); return o1.getNum()!=o2.getNum()?o1.getNum()-o2.getNum():o1.getType()-o2.getType(); } }
测试:
public class 比较器 { public static void main(String[] args) { Vector<Card> vector=new Vector<>(); vector.add(new Card(7, 4)); vector.add(new Card(1, 1)); vector.add(new Card(3, 2)); vector.add(new Card(7, 3)); vector.add(new Card(3, 1)); Collections.sort(vector,new MyComparetor())
;//使用外部比较器 for (int i = 0; i < vector.size(); i++) { System.out.println(vector.get(i).toString()); } } }
结果一样。优点更优雅。
3.treeMap的排序。treeMap可以按照key排序。比较特殊,也可以自定义key的排序规则,默认按照字典key排序。
其实只是写法不同,原理都是和上面所述的差不多。
下面这写法就是外部比较器的写法。不写的话在Card类里面同样实现了比较接口就等同与内部比较器,结果一样。如果都不设定的话就按照默认的字典顺序进行排序。
public class Test { public static void main(String[] args) { //比较key TreeMap<Card, String> map=new TreeMap<>(new Comparator<Card>() { @Override public int compare(Card o1, Card o2) { return o1.getNum()!=o2.getNum()?o1.getNum()-o2.getNum():o1.getType()-
o2.getType(); } }); map.put(new Card(1, 2), "bb"); map.put(new Card(2, 4), "dd"); map.put(new Card(2, 1), "cc"); map.put(new Card(1, 1), "aa"); System.out.println(map); } }
结果:
{Card [num=1, type=1]=aa, Card [num=1, type=2]=bb, Card [num=2, type=1]=cc, Card [num=2, type=4]=dd}