昨天去笔试,发现居然关于这两个问题都忘得模糊了,复习一下。
1. Comparable接口
Comparable 是一个对象本身就已经支持自比较所需要实现的接口,位于java.lang下,实现该接口的类如String,int等可直接排序,
如Arrays.sort(new int[]{5,4,1,7})
该类将比较规则定义在实现该接口的类的内部,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
public class ComparableTest {
/**
* @param args
*/
public static void main(String[] args) {
Student s1 = new Student((int) (Math.random()*10));
Student s2 = new Student((int) (Math.random()*10));
System.out.println(s1.equals(s2));
Student s3 = new Student((int) (Math.random()*10));
System.out.println("S1.value: "+s1);
System.out.println("S2.value: "+s2);
System.out.println("S3.value: "+s3);
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);//直接排序
System.out.println("AfterSort:");
for(Iterator<Student> it=list.iterator();it.hasNext();){
System.out.print(it.next()+" ");
}
}
}
class Student implements Comparable<Object> {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Student() {
value = 0;
}
public Student(int value) {
this.value = value;
}
//定义自己的比较规则,升序排列
@Override
public boolean equals(Object obj) {
Student s = (Student) obj;
return this.value == s.getValue();
}
@Override
public String toString() {
return Integer.toString(value);
}
@Override
public int compareTo(Object o) {
Student stu = (Student) o;
if (this.value > stu.getValue()) {
return 1;
}else if(this.value == stu.getValue())
return 0;
else
return 0;
}
}
2. Comparator接口
位于java.util下,
实现该接口的类只是一个比较规则,在对列表进行排序如Collections.sort()或Arrays.sort的时候,同时将该排序规则传入。
public class ComparatorTest {
/**
* @param args
*/
public static void main(String[] args) {
Teacher s1 = new Teacher((int) (Math.random()*10));
Teacher s2 = new Teacher((int) (Math.random()*10));
Teacher s3 = new Teacher((int) (Math.random()*10));
List<Teacher> list = new ArrayList<Teacher>();
list.add(s1);
list.add(s2);
list.add(s3);
System.out.println("Before Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
Collections.sort(list, new MyComparator());//按照MyComparator类的排序方式排序
System.out.println("/nAfter Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
}
}
class MyComparator implements Comparator<Teacher>
{
//自己定义排序规则类,按降序排列
@Override
public int compare(Teacher o1, Teacher o2) {
if(o1.getValue()>o2.getValue())
return -1;
else if(o1.getValue()== o2.getValue())
return 0;
else
return 1;
}
}
class Teacher
{
private int value;
public int getValue() {
return value;
}
public Teacher()
{
value=0;
}
public Teacher(int value)
{
this.value=value;
}
public String toString()
{
return Integer.toString(value);
}
}
总结:用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
另外:Collection VS Collections