我有这堂课:
public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;
public int compareTo (Sample sampleToCompare) {
int compResult = this.a.compareTo(sampleToCompare.a);
return (compResult != 0 ? compResult :
this.b.compareTo(sampleToCompare.b));
}
}
我希望compareTo()
使用不同的类属性来表现或排序,具体取决于是否设置了标志。
所以,如果flag == 1
我希望compareTo()
使用属性c
,否则为flag == 0
,无论当前方法是什么。
换句话说,以不同的方式对同一个类进行排序。
我不知道如何实现这一目标。请帮忙。
另外,如果我需要更多信息,请告诉我。
答案 0 :(得分:4)
如果要实现不同类型的排序,您应该查看java.util.Comparator界面。
public class SampleComparatorA implement Comparator<Sample> {
public int compare(Sample a, Sample b) {
// Your sorting
}
}
并使用java.util.Collections.sort()方法将比较器作为secound参数。
Collections.sort(aSampleList, new SampleComparatorA());
答案 1 :(得分:3)
怎么样:
public int compareTo(Sample sampleToCompare) {
if (flag == 1) {
return this.c.compareTo(sampleToCompare.c);
}
if (flag == 0) {
// current stuff
}
...
}
但这并不是一种非常面向对象的方式。可能你应该有两个不同的比较器,并根据你的“标志”值选择它们。类似的东西:
class Sample {
private String a;
private String b;
private String c;
}
class ASampleComparator implements Comparator<Sample> {
public int compare(Sample o1, Sample o2) {
return o1.a.compareTo(o2.a);
}
}
class BSampleComparator implements Comparator<Sample> {
public int compare(Sample o1, Sample o2) {
return o1.b.compareTo(o2.b);
}
}
class CSampleComparator implements Comparator<Sample> {
public int compare(Sample o1, Sample o2) {
return o1.c.compareTo(o2.c);
}
}
public Comparator<Sample> pickComparator(int flag) {
switch (flag) {
case 0:
return new ASampleComparator();
case 1:
return new BSampleComparator();
case 2:
return new CSampleComparator();
default:
throw new IllegalArgumentException("Bad flag value: " + flag);
}
}
答案 2 :(得分:1)
你应该让你的标志保持静态,这样比较就会保持一致(如Effective Java, item 12中所述),否则你可能会a.compareTo(b)
返回a > b
,但b.compareTo(a)
}返回b > a
。所以我能想到的最简单的实现是:
public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;
public static boolean my_flag = false;
public int compareTo (Sample sampleToCompare) {
if (flag) {
return this.c.compareTo(sampleToCompare.c);
}
int compResult = this.a.compareTo(sampleToCompare.a);
return (compResult != 0 ? compResult :
this.b.compareTo(sampleToCompare.b));
}
}