文中部分数据来源于网络其他文章,由于未能分辨出真正源头,遂不在此说明引用地址,如有疑问,可留言,谢谢。
Java中 根据对象的某一个成员变量对集合进行排序,有两种情况,一种是将要排序的类直接实现接口 java.lang.Comparable,另一种是使用比较器 java.util.Comparator。
要求:有一个集合 List
我们使用实现接口 java.lang.Comparable 的方法来完成依据 name 的排序,使用比较器 java.util.Comparator 来完成依据 age 的排序。
上代码:
public class CompareMethods {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Person("aaa",50));
list.add(new Person("ccc",20));
list.add(new Person("bbb",30));
list.add(new Person("ddd",10));
printList("未排序:",list);
//方法一使用 Collections.sort(list); 进行排序
Collections.sort(list);
printList("comparable排序:",list);
System.out.println("---------------分割线-------------------");
printList("未排序:",list);
//方法一使用 Collections.sort(list,Comparator); 进行排序,第二个参数是下面定义的比较器
Collections.sort(list,new PersonByComparator());
printList("comparator排序:",list);
}
/**
* 用于打印信息
*/
private static void printList(String mark,List list) {
for(Person p : list) {
System.out.println(mark+"name is:"+p.getName()+" age is:"+p.getAge());
}
}
/**
* 实现比较器的内部类
*/
private static class PersonByComparator implements Comparator {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
}
public class Person implements Comparable
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return name.compareTo(o.getName());
}
}
未排序:name is:aaa age is:50
未排序:name is:ccc age is:20
未排序:name is:bbb age is:30
未排序:name is:ddd age is:10
comparable排序:name is:aaa age is:50
comparable排序:name is:bbb age is:30
comparable排序:name is:ccc age is:20
comparable排序:name is:ddd age is:10
---------------分割线-------------------
未排序:name is:aaa age is:50
未排序:name is:bbb age is:30
未排序:name is:ccc age is:20
未排序:name is:ddd age is:10
comparator排序:name is:ddd age is:10
comparator排序:name is:ccc age is:20
comparator排序:name is:bbb age is:30
comparator排序:name is:aaa age is:50
js中实现数组的排序和上文中的java第二种排序方式(使用比较器排序)相仿,本文只对数组进行排序,对象的排序笔者还没有研究过,如有好的办法,请留言,谢谢。
要求 找出指定数组 arr 中,最接近20的数字,并按照离20的差距从小到大进行排序。
上代码:
var arr = [1, 52, 23, 30, 26, 38, 59, 44, 15, 10];
var this_arr = 20;
arr.sort(function(a, b) {
//Math.abs方法是取绝对值
return Math.abs(a - this_arr) - Math.abs(b - this_arr);
})
console.log(arr[0]);
代码中的 function(a,b) 就类似 java 中的比较器 java.util.Comparator