【问题标题】:Indexes mapping from sorted to original array从排序到原始数组的索引映射
【发布时间】:2012-02-29 18:49:03
【问题描述】:

在 Java 中,有什么简单的方法可以对元素数组进行排序,以维护有关元素存储在原始数组中的索引的信息?有内置函数吗?

我能想到的方法很少,但没有一个是微不足道的。

  1. 自己实现排序函数,并将一个索引数组与排序后的数组一起返回到原始数组。
  2. 将元素包装到一个类中,并将原始数组的索引存储在该类中,避免使用您的排序功能。

我需要它的原因是重新排列矩阵中的行,当重新排列的顺序由向量中的值指定时。向量中的值应按升序排列,矩阵中的行应相应重新排列。

【问题讨论】:

    标签: java arrays sorting indexing


    【解决方案1】:

    恕我直言,您最好创建自己的设计,也许创建一个名为 MyDataSorter 的类,其方法是 sort (yourArray),它返回您的自定义类的排序列表,该类也可以采用泛型......类似

    List<OriginalOrderKeeper<MyDataType>> sort (MyDataType [] array)

    【讨论】:

    • 我会选择一个非常相似的选项。类似于 IndexedDouble 类的 2 个字段:double 和原始数组中的索引。不幸的是,泛型的一个问题是我必须为每个简单类型数组指定一个具体类型,这会增加声明的数量。
    【解决方案2】:

    假设您可以直接对矩阵中的行重新排序,则不需要索引。

    您可以尝试使用Arrays.sort(Object[] a, Comparator c) 使用特殊的比较器对它们进行排序:

    public class RowComparator implements Comparator<double[]> {
    
        public final int columnIndex;
    
        @Override
        public int compare(double[] row1, double[] row2) {
            return Double.compare(row1[columnIndex], row2[columnIndex]);
        }
    
        public RowComparator(int columnIndex) {
            super();
            this.columnIndex = columnIndex;
        }
    
        }
    

    您使用与比较相关的列索引来初始化比较器。

    编辑:行和列有点混乱。我假设一个 double[rows][columns] 数组。

    【讨论】:

      【解决方案3】:

      为什么不在Map&lt;Object, Integer&gt; 中排序和存储索引之前对原始数组进行一次迭代?

      【讨论】:

      • 对象是一个 double,并且需要对双精度数组进行排序,所以你会得到一些装箱,除非像 trove 之类的其他库是使用它为简单类型提供映射。但你最终还是要创建和维护一张地图。
      • @Leonid 为什么不直接复制原来的 double[] 来保留它呢?
      猜你喜欢
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多