按值对象对 LinkedHashMap 键集进行排序 属性

Sorting a LinkedHashMap keyset by values object property

我有这个 LinkedHashMap 包含整数索引和对象对值:

Map<Integer, Paire> population1 = new LinkedHashMap<>();

我的一对 class 相当简单,看起来像这样:

 public class Paire {

     float valeur;
     int index;

 public Paire(LinkedList<Sommet> liste, float valeur, int index) {

    this.liste = liste;
    this.valeur = valeur;
    this.index = index;
}

现在我想存储我的地图的键集,按 class 中的浮点值排序 (valeur),在 LinkedList 中:

List<Integer> selection1 = new LinkedList(population1.keySet());

我知道我可以使用 Collection.sort 对值进行排序,然后如果这些值是简单的字符串或数字,则可以追溯它们各自的键,但我有点迷失在这里。 我觉得有一些简单快捷的方法可以做到这一点,而无需中间列表和变量。此外,我的代码的执行需要尽可能快(TSP 的遗传算法)。

Collections.sort(selection1, new Comparator<Integer>() {
  @Override public int compare(Integer key1, Integer key2) {
    return Float.compare(
         population1.get(key1).valeur, population1.get(key2).valeur);
  }
});

不过,如果您关心速度,LinkedList 永远不是您的朋友。使用 ArrayList.

我推荐使用流(在我看来,它应该比 Collections.sort 快得多):

List<Integer> list = population1.entrySet().stream().sorted((e1, e2) -> Float.

compare(e1.getValue().valeur,e2.getValue().valeur)).map(Map.Entry::getKey)

  .collect(Collectors.toList());

I do a lot of getFirst() and removeFirst(), this is why I use LinkedList.

更好地恢复 ArrayList 的顺序,您可以使用:

    list.get(list.size() - 1)

而不是

 getFirst()

 list.remove(list.size() - 1)

而不是

 removeFirst()

因为获取和删除 ArrayList 的最后一个元素非常非常快。

P.S. LinkedList 几乎在任何情况下都非常非常慢