【问题标题】:element position in arraylist after sort排序后arraylist中的元素位置
【发布时间】:2014-05-29 09:37:28
【问题描述】:

假设我有以下:

List<Double> test = new ArrayList<Double>();
test.add(1.0);
test.add(1.3);
test.add(1.1);
test.add(1.2);
test.add(1.5);

如果我想对值进行排序,我可以使用Collections.sort(test)。这将按升序对它们进行排序。有没有办法在排序发生之前仍然保持对原始位置的引用?

例如排序之后就是

test.add(1.0);
test.add(1.1); - would be index position 3
test.add(1.2); - would be index position 2
test.add(1.3);
test.add(1.5);

这是可能的还是只是一种错误的方法?

【问题讨论】:

  • 如果您想保留原始索引,请创建第二个列表(重复)并排序该列表,而不是原始索引

标签: java sorting arraylist map


【解决方案1】:

由于Collections.sort() 对原始列表进行排序并且不给您副本,所以不会。您必须在排序之前获取列表的副本。

另一种方法是创建一个元组列表 - 原始值及其索引,并使用比较器单独比较值进行排序,例如

test.add(new Pair(1, 1.0));
test.add(new Pair(2, 1.2));
Collections.sort(test, new PairComparator()); // this sorts on the 2nd value of each Pair

等等。这将为您提供一个记录了原始位置索引的元组列表。

【讨论】:

    【解决方案2】:

    你可以使用HashMap

    Map<Integer, Double> test = new Hashmap<>();
    test.put(1, 1.0);
    test.put(2, 1.3); //etc.
    

    即使你对它进行排序,键也不会改变。

    【讨论】:

    • 既然是地图,是不是要求所有的键都是唯一的?我很可能在数组列表中有相同的双精度值
    • 您的键是原始位置,因此是唯一的。但是,您的值可能会重复
    • 那你如何按值排序呢?有我可以使用的实用程序吗?
    • 在地图(即test.values())上调用values()方法,您将获得地图值列表以使用它们进行操作。 Key 仅用于为元素设置唯一标识符。有关 Hashmaps 的更多信息,请查看 tutorialspoint.com/java/util/java_util_hashmap.htm 似乎足以理解该主题
    • 对于排序 Hashmap(以及许多其他内容)的解决方案,Google 是您的朋友 :D -> mkyong.com/java/how-to-sort-a-map-in-java
    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-04-18
    • 1970-01-01
    • 2016-02-21
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多