您的位置:首页 > 其它

Comparator VS Comparable && sort

2010-01-09 10:55 330 查看
昨天去笔试,发现居然关于这两个问题都忘得模糊了,复习一下。

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

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: