1. Comparator 和 Comparable 相同之处
都是java的一个接口,用来对自定义class的类进行比较
2. Comparator 和 Comparable 的区别
Comparable 定义在 Person类的内部:
public class Person implements Comparable<Person>{..比较Person的大小..}
利用Collections.sort(personList)可以得到正确的结果。
Comparator 定义在Person的外部
Person类的结构不需要有任何变化,如public class Person{ String name; int age}
另外定义一个比较器:public PersonComparator implements Comparator<Person> {..比较Person的大小..}
利用Collections.sort( personList , new PersonComparator() )可以得到正确的结果。
3. Comparator 和 Comparable 的实例
Comparator实例:
package com.test;
import java.util.*;//util全称utility工具
/**
* 对Person集合类按名字排序,若名字相同则按年龄大小排序
*/
public class test
{
public static class Person //定义Person类
{
private String name; //名字
private int age; //年龄
public Person(String name, int age) //带两个参数的构造函数
{
this.name = name;
this.age = age;
}
public String getName() //获得名字
{
return this.name;
}
public int getAge() //获得年龄
{
return this.age;
}
public String toString() //为了输出方便,重写了toString()
{
return getName() +" " + getAge();
}
}
//定义比较器
public static class PersonComparator implements Comparator<Person>
{
public int compare(Person one, Person another)
{
int i = 0;
i = one.getName().compareTo(another.getName()); // 使用字符串的比较
if(i == 0)
{ // 如果名字一样,比较年龄,返回比较年龄结果
return one.getAge() - another.getAge();
}
else
{
return i; // 名字不一样, 返回比较名字的结果.
}
}
}
public static void main(String[] args)
{
Person[] PersonSet = new Person[]{new Person("zhangsan", 40), new Person("zhangsan", 30), new Person("lisi", 20), new Person("wangwu", 50)};
List<Person> personList = new ArrayList<Person>(); //定义一个 personList (集合)动态数组
personList.add(PersonSet[0]);//添加元素
personList.add(PersonSet[1]);
personList.add(PersonSet[2]);
personList.add(PersonSet[3]);
System.out.println("Person排序前:");
for(int i = 0;i < personList.size();i++)
{
System.out.println(personList.get(i));
}
Collections.sort( personList , new PersonComparator()); //对personList集合(动态数组)进行排序
//遍历personList中的元素
System.out.println("Person排序后:");
for(int i = 0;i < personList.size();i++)
{
System.out.println(personList.get(i));
}
}
}
运行结果:
Person排序前:
zhangsan 40
zhangsan 30
lisi 20
wangwu 50
Person排序后:
lisi 20
wangwu 50
zhangsan 30
zhangsan 40
Comparable实例:
package com.test;
import java.util.*;//util全称utility工具
/**
* 对Person集合类按名字排序,若名字相同则按年龄大小排序
*/
public class test
{
public static class Person implements Comparable<Person> //定义Person类
{
private String name; //名字
private int age; //年龄
public Person(String name, int age) //带两个参数的构造函数
{
this.name = name;
this.age = age;
}
public int compareTo (Person another)
{
int i = 0;
i = name.compareTo(another.name);
if(i == 0) // 如果名字一样,比较年龄, 返回比较年龄结果
{
return age - another.age;
}
else // 名字不一样, 返回比较名字的结果.
{
return i; // 名字不一样, 返回比较名字的结果.
}
}
public String toString() //为了输出方便,重写了toString()
{
return name +" " + age;
}
}
public static void main(String[] args)
{
Person[] PersonSet = new Person[]{new Person("zhangsan", 40), new Person("zhangsan", 30), new Person("lisi", 20), new Person("wangwu", 50)};
List<Person> personList = new ArrayList<Person>(); //定义一个 personList (集合)动态数组
personList.add(PersonSet[0]);//添加元素
personList.add(PersonSet[1]);
personList.add(PersonSet[2]);
personList.add(PersonSet[3]);
System.out.println("Person排序前:");
for(int i = 0;i < personList.size();i++)
{
System.out.println(personList.get(i));
}
Collections.sort( personList); <span style="font-family: Arial, Helvetica, sans-serif;">//对personList集合(动态数组)进行排序</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
//遍历personList中的元素
System.out.println("Person排序后:");
for(int i = 0;i < personList.size();i++)
{
System.out.println(personList.get(i));
}
}
}
运行结果:
Person排序前:
zhangsan 40
zhangsan 30
lisi 20
wangwu 50
Person排序后:
lisi 20
wangwu 50
zhangsan 30
zhangsan 40
参考文章: