[英]Comparator interface
好吧我打算编辑我之前的问题,但我不确定这是否是正确的方法,所以我只是提出另一个关于比较器的问题,现在我希望能够以不同的方式排序。 我有一个银行支票,我想用checkNumber排序然后checkAmount我设法用checkNumber做,但无法弄清楚如何使用checkAmount这是我如何为checkNumber做的:
import java.util.Comparator;
public class Check implements Comparator {
private int checkNumber;
private String description;
private double checkAmount;
public Check() {
}
public Check(int newCheckNumber, double newAmountNumber) {
setCheckNumber(newCheckNumber);
setAmountNumber(newAmountNumber);
}
public String toString() {
return checkNumber + "\t\t" + checkAmount;
}
public void setCheckNumber(int checkNumber) {
this.checkNumber = checkNumber;
}
public int getCheckNumber() {
return checkNumber;
}
public void setAmountNumber(double amountNumber) {
this.checkAmount = amountNumber;
}
public double getAmountNumber() {
return checkAmount;
}
@Override
public int compare(Object obj1, Object obj2) {
int value1 = ((Check) obj1).getCheckNumber();
int value2 = ((Check) obj2).getCheckNumber();
int result = 0;
if (value1 > value2){
result = 1;
}
else if(value1 < value2){
result = -1;
}
return result;
}
}
import java.util.ArrayList;
import java.util.Collections;
import test.CheckValue;
public class TestCheck {
public static void main(String[] args) {
ArrayList List = new ArrayList();
List.add(new Check(445, 55.0));
List.add(new Check(101,43.12));
List.add(new Check(110,101.0));
List.add(new Check(553,300.21));
List.add(new Check(123,32.1));
Collections.sort(List, new Check());
System.out.println("Check Number - Check Amount");
for (int i = 0; i < List.size(); i++){
System.out.println(List.get(i));
}
}
}
非常感谢你,如果我以错误的方式提交东西,请告诉我。
您应该使Check implements Comparable<Check>
,但不会自己implements Comparator
。
Comparable
类型定义类型的自然顺序,类型的Comparator
通常不是类型本身,并定义它们自己的类型的自定义顺序。
此外,您不应该使用原始类型。 您需要使用参数化泛型类型, Comparable<Check>
, Comparator<Check>
, List<Check>
等。
String
示例 我们来看看String
有什么:
public final class String implements Comparable<String>
String
将其自然顺序定义为区分大小写 public static final Comparator<String> CASE_INSENSITIVE_ORDER
Comparator<String>
使用它的一个例子如下:
List<String> list = new ArrayList<String>(
Arrays.asList("A", "B", "C", "aa", "bb", "cc")
);
Collections.sort(list);
System.out.println(list);
// prints "[A, B, C, aa, bb, cc]"
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
System.out.println(list);
// prints "[A, aa, B, bb, C, cc]"
下面是使用其自然顺序和您自己的自定义Comparator<String>
对List<String>
进行排序的示例。 请注意,我们已经定义了自己的Comparator<String>
,甚至没有更改final class String
本身。
List<String> list = new ArrayList<String>(
Arrays.asList("1", "000000", "22", "100")
);
Collections.sort(list);
System.out.println(list);
// prints "[000000, 1, 100, 22]" natural lexicographical ordering
Comparator<String> lengthComparator = new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return Integer.valueOf(s1.length())
.compareTo(s2.length());
}
};
Collections.sort(list, lengthComparator);
System.out.println(list);
// prints "[1, 22, 100, 000000]" ordered by length
Comparator<String> integerParseComparator = new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return Integer.valueOf(Integer.parseInt(s1))
.compareTo(Integer.parseInt(s2));
}
};
Collections.sort(list, integerParseComparator);
System.out.println(list);
// prints "[000000, 1, 22, 100]" ordered by their values as integers
您可以按照String
设置的示例进行操作,并执行以下操作:
public class Check implements Comparable<Check> {
public static final Comparator<Check> NUMBER_ORDER = ...
public static final Comparator<Check> AMOUNT_ORDER = ...
public static final Comparator<Check> SOMETHING_ELSE_ORDER = ...
}
然后,您可以按如下方式对List<Check>
进行排序:
List<Check> checks = ...;
Collections.sort(checks, Check.AMOUNT_ORDER);
你真正想要做的是定义一个单独的类来充当Comparator
对象 - 不要让你的实际Check
类成为比较器,而是有3个类:
Check
类本身 Comparator<Check>
的CheckAmountComparator
类(或类似的类) Comparator<Check>
的CheckNumberComparator
类(或类似的东西) 然后,当您想要以某种方式排序时,您只需传递一个Comparator
实例类的实例,该实例类与您要执行的排序类型相对应。 例如,按金额排序,它会变成......
Collections.sort(yourListVariable, new CheckAmountComparator());
另外 - 我强烈建议将变量命名为List
以外的其他变量,因为List在Java中用作类型名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.