好吧我打算编辑我之前的问题,但我不确定这是否是正确的方法,所以我只是提出另一个关于比较器的问题,现在我希望能够以不同的方式排序。我有银行支票,我想用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));
}
}
}
非常感谢您,如果我以错误的方式提交内容,请告诉我。
答案 0 :(得分:2)
您应该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]"
以下是使用自然排序和您自己的自定义List<String>
对Comparator<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);
答案 1 :(得分:2)
你真正想做的是定义一个单独的类作为Comparator
对象 - 不要让你的实际Check
类成为比较器,而是3个班级:
Check
类本身CheckAmountComparator
Comparator<Check>
类(或类似的类)
CheckNumberComparator
Comparator<Check>
类(或类似的类)
醇>
然后,当您想要以某种方式排序时,您只需传递Comparator
的实例 - 实现与您要执行的排序类型相对应的类。例如,要按金额排序,它就会变成......
Collections.sort(yourListVariable, new CheckAmountComparator());
此外 - 我强烈建议将变量命名为List
以外的变量,因为List在Java中用作类型名称。