按值对象对 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 几乎在任何情况下都非常非常慢
我有这个 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 几乎在任何情况下都非常非常慢