Интерфейс компаратора - PullRequest
1 голос
/ 16 мая 2010

хорошо, я собирался отредактировать свой предыдущий вопрос, но я не был уверен, что это был правильный способ сделать это, поэтому я просто задам другой вопрос о Comparator, теперь я хочу иметь возможность сортировать различными способами. У меня есть банковские чеки, и я хочу отсортировать с 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 ]

2 голосов
/ 16 мая 2010

Что вы действительно хотите сделать, так это определить отдельный класс, который будет действовать как объект Comparator - не делайте ваш фактический Check класс компаратором, но вместо этого имейте 3 класса:

  1. Check сам класс
  2. a CheckAmountComparator класс (или что-то подобное), который реализует Comparator<Check>
  3. a CheckNumberComparator класс (или что-то подобное), который реализует Comparator<Check>

Затем, когда вы хотите отсортировать так или иначе, вы просто передаете экземпляр класса Comparator, соответствующий типу сортировки, который вы хотите выполнить. Например, чтобы отсортировать по количеству, он стал бы ...

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

Также - я бы настоятельно рекомендовал присвоить вашей переменной имя, отличное от List, поскольку List используется в качестве имени типа в Java.

2 голосов
/ 16 мая 2010

Ты должен сделать Check implements Comparable<Check>, но не сам implements Comparator.

Тип Comparable определяет естественное упорядочение для типа, а Comparator для типа обычно не является самим типом и определяет их собственное упорядочение этого типа.

Похожие вопросы


Кроме того, вы не должны использовать необработанный тип. Вам необходимо использовать параметризованные универсальные типы: Comparable<Check>, Comparator<Check>, List<Check> и т. Д.

Смежные вопросы


A String пример

Давайте посмотрим, что имеет String:

  • public final class String implements Comparable<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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...