2015-03-13 2 views
-2

Я использую List<Point2D.Double> serie в своем grapher для хранения координат точки. Когда я хочу разобраться, я решил использовать Collections.sort(serie), но это показывает, что есть ошибка, какCollections.sort не работает в List <Point2D.Double>

Там не может быть двойной тип

Так как я могу сортировать List<Point2D.Double> по x координаты?

+0

показать нам исключение –

+2

«, но это показывает, что есть ошибка: «вам нужно быть более конкретным. Сообщение об ошибке, с которой вы сталкиваетесь (1), позволяет другим с подобной ошибкой найти ваш вопрос и возможные ответы (2), чтобы люди, которые знают, что такое ошибка, означает запись ответа, прежде чем создавать код, который будет воспроизводить вашу проблему. – Pshemo

+2

Вы получаете ошибку компиляции? Если это так, вам нужно предоставить собственный компаратор, потому что класс 'Point2D.Double' не реализует интерфейс' Comparable'. – kraskevich

ответ

4

С documentation из Collections.sort(List<T>) вы можете увидеть

Все элементы в списке должны реализовывать интерфейс Сопоставимые

, которая предписана

public static <T extends Comparable<? super T>> void sort(List<T> list) 

Так список должен быть объявлен для хранения элементов типа, который простирается/реализует Comparable но Point2D.Double не реализует Comparable поэтому не является допустимым типом.

Для этих случаев Java добавляет

public static <T> void sort(List<T> list, Comparator<? super T> c) 

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

Так что ваш код может выглядеть

Collections.sort(serie, new Comparator<Point2D.Double>() { 
    public int compare(Point2D.Double p1, Point2D.Double p2) { 
     return Double.compare(p1.getX(), p2.getX()); 
    } 
}); 

или вы можете записать его в Java 8, как

Collections.sort(serie, Comparator.comparingDouble(Point2D.Double::getX)); 

или даже

serie.sort(Comparator.comparingDouble(Point2D.Double::getX)); 
+0

спасибо большое, он работает! иногда мне трудно читать английский API (английский не мой родной язык) – Denis

+0

@Denis Да, я понимаю, что вы имеете в виду. API, как правило, написан таким образом, что для полного понимания этого требует от нас дополнительного тестового кода, чтобы убедиться, что мы правильно его понимаем :) – Pshemo

2

Point2D не реализует интерфейс Comparable. Вам нужно будет создать пользовательский Comparator, который выполняет операцию, которую вы хотите, и передать его в метод sort вместе со списком, например ...

Collections.sort(serie, new Comparator<Point2D.Double>() { 
    public int compare(Point2D.Double p1, Point2D.Double p2) { 
     return (int)(p1.getX() - p2.getX()); 
    } 
}); 
+0

Но разве это не Point2D.Double, который является двойным классом, определяемым как внутренний класс Point2D. Это Point2D, которому нужен компаратор/сопоставимый или двойной класс внутри него? – muasif80

+0

@ muasif80: «Point2D.Double» - это как вложенный класс, так и подкласс «Point2D», поэтому не имеет значения, какой класс не реализует 'Comparable' (оба не делают), поскольку * точки не имеют естественных порядок вообще *. – Holger

+0

Ну, у вас есть экземпляр Point2D.Double, поэтому это позволяет сравнить только Point2D.Double.Вы хотите сравнить любой экземпляр Point2D, вы можете изменить требование компаратора к совпадению () – MadProgrammer