对象排序有两种方法,自定义排序和实现Java中的比较器接口排序。
对自定义对象排序,我们可以根据自定义对象的数据结构,自定义排序规则来实现。也可以用Java中的两个常用的接口Comparable和Comparator,实现将自定义对象排序。
本片文章就如何用java中的两个接口Comparable和Comparator实现自定义对象排序进行讲解。
1. 实现Comparable接口
Comparable接口对实现该接口的每个类的对象强加一个整体排序,这个排序称为类的自然排序(升序),该接口有且只有一个方法int compareTo(T o),compareTo方法称为自然比较方法。继承此接口需要实现该方法。compareTo返回值-1、0、1。***可以在此方法中自定义比较规则***
。Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。
public class SubComparator implements Comparable<SubComparator> {
private String name;
private Integer num = 2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SubComparator() {
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
@Override
public int compareTo(SubComparator o) {
if (num > o.getNum()) {
return 1;
} else if (num < o.getNum()) {
return -1;
} else {
return 0;
}
}
}
public class TestComparatble {
public static void main(String[] args) {
SubComparator s1 = new SubComparator();
s1.setName("s1");
s1.setNum(4);
SubComparator s2 = new SubComparator();
s2.setName("s2");
s2.setNum(8);
SubComparator s3 = new SubComparator();
s3.setName("s3");
s3.setNum(12);
SubComparator s4 = new SubComparator();
s4.setName("s4");
s4.setNum(6);
List<SubComparator> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
Collections.sort(list);
for (SubComparator subComparator : list) {
System.out.println(subComparator.getName());
}
}
}
2.实现Comparator接口
将比较器传递给排序方法(Collections.sort或Arrays.sort ),对不具有排序功能的对象列表提供排序功能 。可以对排序顺序进行控制(升序,降序)。Collections.sort(List list, Comparator<? super T> c) ,Arrays.sort(T[] a, Comparator<? super T> c)根据指定的比较器排序顺序对指定的列表进行排序。在Comparator比较器中重写int compara(T o1,To2)
,如果遇到数字的比较,直接在方法内返回两个对象的属性的差值,例如o1.getValue()-o2.getValue() 是升序,o2.getValue()-o1.getValue() 是降序;如果遇到字符形式的比较利用compareTo(T o) 方法进行比较,该方法比较从头开始每一个字符,当前者大于后者返回1,当前者小于后者返回-1。
public class BaseClass {
private String name;
private Integer num;
public BaseClass() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
}
public class TestComparator {
public static void main(String[] args) {
BaseClass b1 = new BaseClass();
b1.setName("test12");
b1.setNum(5);
BaseClass b2 = new BaseClass();
b2.setName("tesrr23");
b2.setNum(9);
BaseClass b3 = new BaseClass();
b3.setName("tesy12");
b3.setNum(6);
BaseClass b4 = new BaseClass();
b4.setName("tesk2345");
b4.setNum(12);
List<BaseClass> list = new ArrayList<>();
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
for (BaseClass baseClass : list) {
System.out.println(baseClass.getName());
}
Collections.sort(list, new Comparator<BaseClass>() {
@Override
public int compare(BaseClass o1, BaseClass o2) {
return o1.getNum()-o2.getNum();
}
});
for (BaseClass baseClass : list) {
System.out.println(baseClass.getName());
}
Collections.sort(list, new Comparator<BaseClass>() {
@Override
public int compare(BaseClass o1, BaseClass o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (BaseClass baseClass : list) {
System.out.println(baseClass.getName());
}
}
}