java - 对通用对象 Java 的数组列表进行排序

标签 java sorting generics arraylist

我有一个 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/

相关文章:

java - Struts 1.3 的替代品有哪些

java 套接字 : listen before accept?

c++ - C++结构数组的新顺序

java - 什么是原始类型,为什么我们不应该使用它呢?

java - 是否调用 finish() ?

java - 通过调用生成的代理类来使用 SOAP WSDL

c++ - 如何通过使用for循环c++将一个 vector 放入另一个 vector 来组织一个 vector

python - 如何对 Pandas DF 列中的值进行排序并删除重复项

java - 如何迭代通用 Map

c# - 如何在 C# 文件中创建 List<T> 实例