【发布时间】:2021-05-02 10:46:15
【问题描述】:
在 Java 中,我有一个动态的(大小:例如 5-45)值对(double、int)列表。我想按第一个双值(不是唯一的!)对列表进行降序排序,并获得第二个 int 值的排序列表。
例如:
input:
0.245 3654
-0.12 7466
0.421 2551
-0.12 1882
0.637 3662
-0.35 5221
0.421 6332
sorted:
0.637 3662
0.421 2551
0.421 6332
0.245 3654
-0.12 7466
-0.12 1882
-0.35 5221
我想要一个普通的 ArrayList,例如:3662 2551 6332 3654 7466 1882 5221
是否有一些相同的双值并不重要;先到先得。
我不能使用排序的 TreeMap,因为第一个值 (double) 不是唯一的。其他 HashMaps/LinkedLists/ArrayLists/Arrays 呢? 我手动尝试(在一个循环中,比较所有值并保留 2 个列表),它有效,但速度很慢。我也尝试了 2d Array double[][] (但它们的长度必须是固定的,而且我在某处得到了一些空指针)。
我需要:高排序性能,并且 - 如果可能 - 不需要额外的框架(例如 MultiMap)在您看来最优雅和最快的方式是什么?
这是我自己的初学者风格(但这太慢了!!):
pair-value is: e m
for (...kind of a loop...){
e = method.get(....);
m = method.get(....);
if (eList.isEmpty()) {
eList.add(e);
rList.add(m);
} else {
higher = false;
for (int i = 0; i < eList.size(); i++) {
if (e >= eList.get(i)) {
eList.add(i, e);
rList.add(i, m);
higher = true;
break;
}
}
if (!higher) {
eList.add(e);
rList.add(m);
}
}
【问题讨论】:
-
显示您的 HashMaps/LinkedLists/ArrayLists/Arrays 尝试,以便其他人可以看到并评估如何改进代码
-
您真的需要对整个列表进行排序还是只对列表的一部分进行排序?该列表是否适合内存,还是必须从磁盘中流式传输?
-
它基本上是一个值对的列表,是吗?所以创建一个
ValuePair类并创建一个List<ValuePair>来保存它们。按ValuePair的double成员降序排序并按int成员升序排序?没问题!您可以创建一个Comparatot<ValueList>来强制执行您喜欢的任何排序顺序,并将其与Collections.sort()一起使用。 -
是的,我需要对整个列表进行排序。并且最多条目约为 65,因此它应该很容易放入内存中。我的尝试真的是初学者的风格,发布很可惜。这只是一种解决方法,但我想有强大的数据类型(地图/列表),它们的内置排序算法应该性能更高。所以请告诉我,如果你有一些想法。
-
@KevinAnderson:是的,这可能是个好主意,我会考虑的。速度快吗?
标签: java arrays sorting dictionary arraylist