重点内容
-compareTo与compare方法的区别
-List数组实现不限定的多个类对象添加
-Collections.sort排序的使用
易混淆的两个方法区别:
1、compareTo(T o)方法是java.lang.Comparable接口中的方法。当需要对某个类的对象进行【排序】时,该类需要实现Comparable接口的,必须重写public int compareTo(T o)方法。比如:MapReduce中Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable接口,实现这个接口可同时用于序列化和反序列化。WritableComparable接口(用于序列化和反序列化)是Writable接口和Comparable接口的组合。(注:T为类名)
2、compare(Object o1,Object o2)方法是java.util.Comparator接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。
接下来我们看看具体方法的实现:
1、Student类:包含学号、姓名和年龄属性;
2、定义一个学生数组,存放若干个学生对象,然后对数组中的对象,按学生年龄从小到大排序。
代码块
首先,写一个Student类,例如:
public class Student implements Comparable<Student>
{
public String No;
public String Name;
public int Age;
public Student(String No,String Name,int Age)
{
this.No=No;
this.Name=Name;
this.Age=Age;
}
// Getters and Setters
public String getNo()
{
return No;
}
public void setNo(String no)
{
this.No = no;
}
public String getName()
{
return Name;
}
public void setName(String name)
{
this.Name = name;
}
public int getAge()
{
return Age;
}
public void setAge(int age)
{
this.Age = age;
}
//compareTo父类的重写
@Override
public int compareTo(Student o)
{
if(this ==o) return 0;
else if (o!=null && o instanceof Student)
{
Student u = (Student) o;
if(Age<=u.Age)
return -1;
else
return 1;
}
else return -1;
}
//字符串输出,toString方法父类的重写
@Override
public String toString()
{
return getNo()+" "+getName()+" "+getAge();
}
}
接下来写一个测试类Main:
public class Main {
public static void main(String[] args) {
List<Student> stu=new ArrayList<>();
stu.add(new Student("001","张三",20));
stu.add(new Student("002","李四",25));
stu.add(new Student("003","王明",29));
stu.add(new Student("004","吴梦",24));
Collections.sort(stu,COMPARATOR);
System.out.println("排序后名单输出为:");
System.out.println(stu);
}
}
运行结果: