2016-04-16 2 views
0

У меня есть проблемы с реализацией моего пользовательского компаратора для моего класса:Невозможно использовать пользовательский компаратор в Java

public class MyProject { 
    private static class SuperClass { 
     public SuperClass (ArrayList<Car> cars) { 
      Collections.sort(cars); 
      Collections.sort(cars, new Car.CustomOrder()); 
     } 
    } 

    public final static class Car implements Comparable<Car> { 
     public Comparator<Car> customOrder() { 
      return new CustomOrder(); 
     } 

     public class CustomOrder implements Comparator<Car> { 
      public int compare(Car c1, Car c2) { 
       // some code 
       return 1; 
     } 
    } 
} 

Я хотел бы сортировать автомобили нестандартного компаратором CustomOrder. Я не могу найти свою ошибку, поэтому, пожалуйста, помогите мне.

+2

Этот код полон неактивного кода. Вы читали сообщения об ошибках из компилятора? Что они говорят? Что ты не понимаешь? Почему вы думаете, что это хорошая идея вложить все ваши классы таким образом? –

+0

Что такое автомобиль ... или более конкретно: что имеет автомобиль для полей, которые вы можете связать с индивидуальным заказом? –

+0

Кроме того, нет смысла (по крайней мере, мне) называть 'sort()' в ctor SuperClass. Это не требуется классу «Компаратор», и нет смысла принудительно выполнять операцию сортировки, как это в компараторе. – markspace

ответ

2
  1. Вы должны реализовать public int compareTo(Car o) в Car класса для компиляции программы.

  2. Collections.sort(cars, new Car().new CustomOrder());, потому что CustomOrder - это внутренний класс, а не статический вложенный. Он может быть создан существующей ссылкой на внешний класс.

Экземпляр внутреннего класса может существовать только внутри экземпляра внешнего класса и имеет прямой доступ к методам и полям его вмещающего экземпляра.


Похоже, вы не понимаете внутренних и вложенных классов полностью. Я предлагаю прочитать о them в Oracle Tutorials.

+3

Хотя вы правы, чтобы сказать, что новый CustomOrder может быть создан таким образом, я думаю, вы также должны сказать, что это, вероятно, ужасный дизайн для OP, чтобы разыгрывать его классы таким образом. – markspace

1

Как предложил Эндрю Тобилко, вам необходимо реализовать метод compareTo в классе Car, потому что вы хотите сравнить объекты Car.

Посмотрите на ссылку Java Object Sorting

Также, пожалуйста, напишите чистый код. Ваш код трудно читать, хотя он короткий.

1

Постарайтесь избавиться от статического ключевого слова, что не является хорошим способом пойти и может стать легко в плохом шаблоне проектирования.

у вас есть класс автомобиль, и список тех, кто где-то, так что независимо от того, если орудия автомобиля или не сравнимые, вы можете использовать анонимные один и использовать поля, необходимые для критериев сортировки ...

Пример:

сортировки списка по OrderId (просто строка)

public static void main(String[] args) { 
    List<Car> myCars = new ArrayList<>(); 
    myCars.add(new Car(0, "qqweqw", "qwe")); 
    myCars.add(new Car(1, "Aqqweqw", "qwe")); 
    myCars.add(new Car(2, "Zqqweqw", "qwe")); 

    System.out.println("unsorted list" + myCars); 
    Collections.sort(myCars, new Comparator<Car>() { 

     @Override 
     public int compare(Car o1, Car o2) { 
      return o1.getOrder().compareTo(o2.getOrder()); 
     } 
    }); 
    System.out.println("sorted list" + myCars); 

} 

затем лет можно увидеть, нет необходимости, чтобы объявить новый компаратор класс, который связывает зависимости с классом автомобиля

+0

Я бы предпочел написать лямбда, чем анонимный класс – Andrew

+1

Я бы хотел, но я не мог найти, разрешено ли java 8 .... спасибо за комментарии –

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