比较器接口

时间:2010-05-16 07:45:48

标签: java

好吧我打算编辑我​​之前的问题,但我不确定这是否是正确的方法,所以我只是提出另一个关于比较器的问题,现在我希望能够以不同的方式排序。我有银行支票,我想用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));
        }



    }

}

非常感谢您,如果我以错误的方式提交内容,请告诉我。

2 个答案:

答案 0 :(得分:2)

您应该Check implements Comparable<Check>,而不是implements Comparator

Comparable类型定义 类型的自然顺序,类型的Comparator通常不是类型本身,并定义它们自己的自定义顺序类型。

相关问题


此外,您不应使用原始类型。您需要使用参数化通用类型Comparable<Check>Comparator<Check>List<Check>等。

相关问题


A String示例

让我们来看看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个班级:

  1. Check类本身
  2. 实现CheckAmountComparator
  3. Comparator<Check>类(或类似的类)
  4. 实现CheckNumberComparator
  5. Comparator<Check>类(或类似的类)

    然后,当您想要以某种方式排序时,您只需传递Comparator的实例 - 实现与您要执行的排序类型相对应的类。例如,要按金额排序,它就会变成......

    Collections.sort(yourListVariable, new CheckAmountComparator());
    

    此外 - 我强烈建议将变量命名为List以外的变量,因为List在Java中用作类型名称。