关于comparator与comparable
comparable实现了
int compareTo(T o)
此接口,a.compare(b),如果a大于b返回1,a小于b返回负数;
comparator实现了
int compare(T o1, T o2)
o1>o2返回正数,o1==o2返回0,o1<o2返回负数;
*由于以上两个方法都不是static method所以实现接口时,需要实现接口内方法。
对于Arrays.sort与Collections.sort排序一般用comparator接口,一是易于实现,二是可以用lambda表达式表达。
关于Arrays.sort与Collection.sort的理解
Arrays.sort一般用于排序数组
Collection.sort一般用于排序列表
实现comparator接口的collection一般用法
public class sortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList();
for (int i = 10; i > 0; i--)
list.add(i);
System.out.print(list);//输出原先顺序
Collections.sort(list, new newComp());
System.out.println();
System.out.print(list);//输出后来顺序
}
}
class newComp implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);//升序
}
}
稍微高级一点的写法,就是把方法写在Collections.sort()的括号里
public class sortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList();
for (int i = 10; i > 0; i--)
list.add(i);
System.out.print(list);//输出原先顺序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);//升序
}});
System.out.println();
System.out.print(list);//输出后来顺序
}
}
再高级一点,用lambda表达式
public class sortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList();
for (int i = 11; i > 0; i--)
list.add(i);
System.out.print(list);//输出原先顺序
Comparator<Integer> cmp = (Integer o1,Integer o2)->{return o1.compareTo(o2);};
Collections.sort(list, cmp);
System.out.println();
System.out.print(list);//输出后来顺序
}
}
再高级一点?lambda直接用list里面的sort方法而不用Collection的
public class sortTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList();
for (int i = 10; i > 0; i--)
list.add(i);
System.out.print(list);//输出原先顺序
list.sort((Integer o1,Integer o2)->{return o1 - o2;});
System.out.println();
System.out.print(list);//输出后来顺序
}
}
很好,我觉得差不多了,关于
Arrays.sort(people,Comparator.comparing(Person::getName));
这种东西我不会,也不想会,88。
最后再说说关于基于collections.sort()的HashMap的排序
众所周知,HashMap把东西放进去之后啊,顺序就不是原来放入的顺序了,他有自己那一套?具体我也不知道。
所以这里我们要对放入进HashMap的东西排序。
主要分三步
1、首先把HashMap的map变为Set<Entry<E,V>>
2、然后新建列表List<Entry<E,V>>
3、通过Comparator 排序List
这样我们的List就有序啦,再通过iterator的foreach输出即可!
具体实现如下
Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String,Integer>> list = new ArrayList<>(set);
Collections.sort(list, new Comparator<Entry<String,Integer>>(){
@Override
public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
// TODO Auto-generated method stub
return arg1.getValue().compareTo(arg0.getValue());
}
});
高级一点的写法。。。。。
List<Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
Comparator<Entry<String, Integer>> cmp = (Entry<String, Integer> arg0, Entry<String, Integer> arg1)->{return arg1.getValue().compareTo(arg0.getValue());};
Collections.sort(list,cmp);
for (Map.Entry<String, Integer> e : list)
System.out.println(e.getKey() + " " + e.getValue());
网友评论