Сортировать массив Список объектов по универсальному элементу - PullRequest
0 голосов
/ 16 января 2019

У меня есть класс Vertex, у которого есть поле 'element', которое является универсальным типом T. Класс Vertex можно увидеть ниже:

public class Vertex<T>{

private ObjectProperty<T> element;
private BooleanProperty visited;

public Vertex() {
    element = null;
    visited = new SimpleBooleanProperty(false);
}

public Vertex(T element) {
    this.element = new SimpleObjectProperty<T>(element);
    this.visited = new SimpleBooleanProperty(false);
}

public Vertex(T element, boolean visited) {
    this.element = new SimpleObjectProperty<T>(element);
    this.visited = new SimpleBooleanProperty(visited);
}

public void setElement(T elem) {
    this.element.set(elem);
}

public T getElement() {
    return this.element.get();
}

public ObjectProperty<T> elementProperty(){
    return this.element;
}

public void setVisited(boolean b) {
    this.visited.set(b);
}

public boolean isVisited() {
    return this.visited.get();
}

public BooleanProperty visitedProperty(){
    return this.visited;
}

@Override
public boolean equals(Object o) {
    if(o == this) {
        return true;
    }

    if(!(o instanceof Vertex<?>)) {
        return false;
    }

    Vertex<?> v=  (Vertex<?>) o;

    if(v.getElement() instanceof String) {
        return v.getElement().equals(this.element.get());
    }else {
        return v.getElement() == this.element.get();
    }


}

@Override
public String toString() {
    return element.get().toString();
}

}

У меня есть ArrayList из Vertex<T> объектов, которые я хочу отсортировать по элементу вершины. В моем приложении тип элемента вершины может быть Integer, Double или String.

Я пытался использовать Comparator, но я не уверен, как они работают, ниже вы можете увидеть, что я пытался реализовать:

listOfNeighbours.sort(Comparator.comparing(Vertex::getElement));

, где listOfNeighbours - это ArrayList из Vertex<T> объектов. Я получаю ошибку для Vertex::getElement о том, что 'Тип Vertex не определяет getElement (Object), который применим здесь'

1 Ответ

0 голосов
/ 16 января 2019

Если вы посмотрите на подпись Comparator.comparing универсальный параметр U extends Comparable<? super U>

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)

, что означает, что все, что возвращает getElement, должно быть Comparable.

Примечание. Здесь тип T - это вершина, а U - это тип того, что getElement возвращает.

Вы можете решить эту проблему, сделав T extends Comparable<? super T> в классе Vertex.

class Vertex<T extends Comparable<? super T>>  {...}
...