【问题标题】:How to get the indexes of sorted list of objects in java?如何获取java中对象排序列表的索引?
【发布时间】:2015-03-31 22:58:44
【问题描述】:

我有一个 java 对象列表。我使用比较器根据特定字段对对象列表进行排序。现在,当列表未排序时,我需要元素的索引。有人可以举一些例子吗?

【问题讨论】:

    标签: java list sorting indexing


    【解决方案1】:

    两种方法:

    • 将您的项目包装在一个包含项目及其索引的类中,对列表进行排序,您将记录原始订单

    • 实现您自己的排序算法

    【讨论】:

    • 我可以创建自己的排序算法,也可以包装到另一个类中。但我想知道java中是否有任何基本的库函数在列表中支持这个。因为它是列表的基本功能,所以我期待一个有效的解决方案。为什么要对此投反对票?
    • 通常不需要它,您应该知道Java拥有最完整的标准库之一,但它无能为力。特别是,它不记录已排序列表中元素的原始顺序。最后,我没有 DV 你的帖子
    【解决方案2】:

    如果您有额外的空间,这仍然可以在O(N log(N))(摊销)时间内完成。只需在排序前构建项目的原始索引的哈希图,然后再将它们读出。

    public static <T> int[] sortedIndices(List<T> lst, Comparator<T> comp){
        HashMap<T, Integer> indicesMap = new HashMap<T, Integer>();
        int i = 0;
        for(T t : lst){
            indicesMap.put(t, i++);
        }
        ArrayList<T> cpy = new ArrayList<T>(lst);
        Collections.sort(cpy, comp);
    
        int[] indices = new int[cpy.size()];
        i = 0;
        for(T t : cpy){
            indices[i++] = indicesMap.get(t);
        }
    
        return indices;
    }
    

    【讨论】:

    • 如果列表包含重复项怎么办?
    • 嗯。好吧,在那种情况下问题有点出问题(如果排序不稳定,您将无法知道原始索引是什么,因为您不知道哪个3 去了哪里)。如果是这种情况,那么您必须实现您的算法。因此,如果桌面上有重复项,我同意您的回答。
    猜你喜欢
    • 2012-11-25
    • 2011-07-05
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多