JAVA中的自然排序以及定制排序
自然排序:
需要实现comparable接口,重写接口中的compareTo方法。实现此接口的对象列表(和数组)可以通过Collections.sort(和 Arrays.sort)进行自动排序
compareTo方法返回值为int。当大于0时表示,当前对象大于传入对象。小于0是表示当前对象小于传入对象。0表示两者相等。
举例:我们定义一个EMP类,按照其名称进行排序
package test;
public class Emp implements Comparable{
private String name;
private int age;
public Emp(String name, int age) {
this.name = name;
this.age = age;
}
public Emp() {
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "emp{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
try {
if(o instanceof Emp){
Emp emp = (Emp) o;
return this.name.compareTo(emp.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
在实现compareTo的时候,我们首先传入对象是否为Emp类或者是Emp的一个子类。如果是进行强转,否则抛出异常。在java中已经为我们实现了很多类型的comparable接口,我们可以直接利用其compareTo方法。本例中使用了string类型的compareTo方法。
我们使用集合中的sort方法进行测试:
public class CompTest {
public static void main(String[] args) {
Emp e = new Emp("qw", 17);
Emp w = new Emp("as", 18);
Emp q = new Emp("zx", 19);
ArrayList<Emp> list = new ArrayList();
list.add(e);
list.add(w);
list.add(q);
Collections.sort(list);
list.forEach(System.out::println);
}
}
输出结果为:
emp{name='as', age=18}
emp{name='qw', age=17}
emp{name='zx', age=19}
缺陷:在本例中,我们实现了EMP中的comparable接口。但是不论是按照年龄还是名字进行排序,我们都只能实现一种。在实际中,我们有时需要按照名称进行排序,有时按照年龄进行排序。这时自然排序就难以满足我们的需求
定制排序
通过实现接口compartor中的 int compare(T o1, T o2)方法来实现(这里使用匿名内部类的方式对年龄进行排序)
@Test
public void test2() {
Emp e = new Emp("qw", 17);
Emp w = new Emp("as", 18);
Emp q = new Emp("zx", 19);
ArrayList<Emp> list = new ArrayList();
list.add(e);
list.add(w);
list.add(q);
Collections.sort(list, new Comparator() {
@Override
public int compare(Object a1, Object b1) {
try {
if (a1 instanceof Emp && b1 instanceof Emp) {
Emp a = (Emp) a1;
Emp b = (Emp) b1;
if (a.getAge() > b.getAge()) return 1;
else if (a.getAge() < b.getAge()) return -1;
else return 0;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
});
list.forEach(System.out::println);
}
输出结果:
emp{name='qw', age=17}
emp{name='as', age=18}
emp{name='zx', age=19}
st.forEach(System.out::println);
}
输出结果:
```java
emp{name='qw', age=17}
emp{name='as', age=18}
emp{name='zx', age=19}