Comparator
简单小结
一般Java中通过接口实现两个对象的比较,比较常用就是Comparable
接口和Comparator
接口
两者区别
- Comparator位于包java.util下,而Comparable位于包java.lang下
- Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较
- 如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序
- Comparable接口强制进行自然排序,而Comparator接口不强制进行自然排序,可以指定排序顺序
调试代码
class Milan {
public String p_Name;
public int p_Id;
public Milan(int p_Id, String p_Name) {
this.p_Id = p_Id;
this.p_Name = p_Name;
}
}
public class ComparatorAct extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.comaprator_act);
init();
}
private final class CompareName implements Comparator<Milan> {
boolean is_Ascend;
public CompareName(boolean b) {
is_Ascend = b;
}
@Override
public int compare(Milan o1, Milan o2) {
// TODO Auto-generated method stub
if (is_Ascend)
return o1.p_Name.compareTo(o2.p_Name);
else
return o2.p_Name.compareTo(o1.p_Name);
}
}
private final class CompareId implements Comparator<Milan> {
boolean is_Ascend;
public CompareId(boolean b) {
// TODO Auto-generated constructor stub
is_Ascend = b;
}
@Override
public int compare(Milan o1, Milan o2) {
// TODO Auto-generated method stub
int a, b;
if (is_Ascend) {
a = o1.p_Id;
b = o2.p_Id;
} else {
a = o2.p_Id;
b = o1.p_Id;
}
if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
}
private void init() {
Milan p1 = new Milan(1, "Dida");
Milan p2 = new Milan(2, "Cafu");
Milan p3 = new Milan(3, "Maldini");
Milan P4 = new Milan(6, "Baresi");
Milan p5 = new Milan(9, "Inzaghi");
Milan P6 = new Milan(10, "Costa");
List<Milan> mList = new ArrayList<Milan>();
mList.add(p1);
mList.add(P6);
mList.add(P4);
mList.add(p2);
mList.add(p5);
mList.add(p3);
System.out.println("初始顺序");
System.out.println("姓名 | 号码");
for (Milan p : mList) {
System.out.println(p.p_Name + " | " + p.p_Id);
}
System.out.println();
System.out.println("对号码降序");
System.out.println("姓名 | 号码");
Collections.sort(mList, new CompareId(false));
for (Milan p : mList) {
System.out.println(p.p_Name + " | " + p.p_Id);
}
System.out.println();
System.out.println("对姓名升序");
System.out.println("姓名 | 号码");
Collections.sort(mList, new CompareName(true));
for (Milan p : mList) {
System.out.println(p.p_Name + " | " + p.p_Id);
}
}
}