繁体   English   中英

比较器接口

[英]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有什么:

使用它的一个例子如下:

    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个类:

  1. Check类本身
  2. 一个实现Comparator<Check>CheckAmountComparator类(或类似的类)
  3. 一个实现Comparator<Check>CheckNumberComparator类(或类似的东西)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM