我有一个 Vertex 类,它有一个通用类型 T 的字段元素。
我有一个 Vertex 对象的 ArrayList,我想对其进行排序,但我不确定如何排序。
我尝试使用比较器,如下所示:
listOfNeighbours.sort(new Comparator<Vertex<T>>() {
@Override
public int compare(Vertex<T> v1, Vertex<T> v2) {
if(v1.getElement() == v2.getElement()){
return 0;
}else if(v1.getElement() < v2.getElement()) {
return -1;
}else {
return 1;
}
}
});
显然,上面的解决方案是错误的,因为我们无法比较泛型,但我想要类似的东西来对我的 Vertex 对象列表进行排序。
在我的应用程序中,T 可以是 Integer、Double 或 String。
感谢任何帮助!
谢谢。
编辑:我的顶点类如下:
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();
}
}
最佳答案
A Comparator是一件好事。它有一个 static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
对于这个具体问题。在你的情况下,那将是
listOfNeighbours.sort(Comparator.comparing(Vertex::getElement))
如果您的 Vertex 组件不是 Comparable
, 我建议 static <T,U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
相反,它可以用自定义比较器提供。
例如,
import java.util.*;
import javafx.beans.property.*;
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();
}
public static void main(String[] args) {
ArrayList<Vertex<String>> listOfNeighbours = new ArrayList<>();
listOfNeighbours.add(new Vertex<>("foo"));
listOfNeighbours.add(new Vertex<>("bar"));
System.out.println(listOfNeighbours);
listOfNeighbours.sort(Comparator.comparing(Vertex::getElement));
System.out.println(listOfNeighbours);
ArrayList<Vertex<Integer>> list2 = new ArrayList<>();
list2.add(new Vertex<>(1));
list2.add(new Vertex<>(123));
list2.add(new Vertex<>(15));
list2.add(new Vertex<>(2));
System.out.println(list2);
list2.sort(Comparator.comparing(Vertex::getElement));
System.out.println(list2);
list2.sort(Comparator.comparing(Vertex::getElement, Comparator.comparing(i -> i.toString())));
System.out.println(list2);
}
}
将如何完成(用 https://www.compilejava.net/ 测试)。
结果是
[foo, bar]
(原始输入)
[bar, foo]
(按字符串排序)
[1, 123, 15, 2]
(原始输入)
[1, 2, 15, 123]
(按整数自然顺序排序)
[1, 123, 15, 2]
(按给定的 String 顺序排序,即按字典顺序排序)。
后者是用 Comparator<Vertex<Integer>>
完成的它通过从给定的 Vertex<Integer>
中提取值来完成工作然后将其转换为 String
,然后用作排序键。
关于java - 对通用对象 Java 的数组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204280/