【问题标题】:Sort array and reflect the changes in another array对数组进行排序并在另一个数组中反映变化
【发布时间】:2012-10-01 05:22:45
【问题描述】:

我有一个双精度数组,用 Java 编写:arr1,我想对其进行排序。第一个选项很可能是实用方法Arrays.sort(double[])

我的想法是我希望将相同的更改(例如,index i 的值与arr1 中的index j 的值互换)反映在另一个整数数组中:arr2(从某种意义上说相同索引处的值也在arr2 中更改)。

有没有一种简单的方法(技巧)可以在 Java 中实现这一点?还是只能自己实现排序算法?

更新:我看到人们建议用一个包含两个值的对象数组替换两个数组(一个来自arr1,一个来自arr2)。这不会带来一些效率损失。换句话说,对对象数组进行排序不是比对原始类型数组(在本例中为双精度类型)效率低吗?

数据是完全静态的。它很大(适合内存)但是是静态的。

【问题讨论】:

  • 有一个索引数组。不要对值数组进行排序,对索引数组进行排序。然后使用索引数组指向两个值数组。解决方法见:stackoverflow.com/questions/4859261/…
  • 这就是所谓的“外部排序”。
  • 解决您的编辑问题:排序可能效率较低(需要确定指标),但您将通过不必对 2 个数组进行排序或在期间进行复杂的索引映射来提高效率值查找。

标签: java arrays sorting


【解决方案1】:

与其尝试维护已排序的并行数组,更简洁的解决方案是创建一个封装两个数据值的类,并且只有一个对象数组。

(但要回答您的问题,在 Java 中没有内置的方法可以做到这一点。实现您自己的排序例程,使两个数组根据其中一个中的值进行排序,这适用于少量数据,即'不太可能改变,但很难维护。)

【讨论】:

  • 对对象数组进行排序与​​对双精度数组进行排序一样高效?
  • @Razvan 对对象数组进行排序将非常有效。我怀疑你是否能够衡量差异。
  • 只是觉得我应该为您的新对象提及Comparable 接口。 docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html
  • 对对象数组进行排序比构建自己可能不那么聪明的排序更有效。这些是您唯一的选择——Java 没有将更改传播到另一个数组的内置方法。
【解决方案2】:

一种不影响排序性能的解决方案,即仍然 O(nlog(n)) 时间复杂度。

  • 使用地图存储array[i] -> i
  • 对数组进行排序
  • 遍历排序后的数组,并为每个值将其用作地图的键以检索原始索引。

编辑:Raihan 的评论让我看起来很痛苦:(

【讨论】:

    【解决方案3】:

    试试这个方法......

    - 使用Arrays.asList() 将此array 转换为ArrayList

    - 创建另一个列表对象引用变量并为其分配相同的 ArrayList 对象,现在对第一个 ArrayList 的任何更改都将反映到第二个 ArrayList。

    例如:

    double[] array = new double[10];
    
    ArrayList<Double> arList_1 = new ArrayList<Double>(Arrays.asList(array));
    
    ArrayList<Double> arList_2 = arList2;
    

    现在对于排序,有 2 个选项:

    - 使用java.lang.Comparable 接口,如果您想仅以一种方式对其进行排序。

    -使用java.util.Comparator接口,如果你想以多于1的方式排序。

    【讨论】:

      【解决方案4】:

      请注意确定您在寻找什么,但另一种解决方法可能是这样的。

      创建一个映射来维护arr1arr2 元素之间的关系

            Map<Double, Double> myLocalMap<Double, Double>();
            for(int ind=0; indx < arr1.length; indx++){
                 myLocalMap.put(Double.valueOf(arr1[indx]), Double.valueOf(arr2[indx]));
            }
      

      现在按照你说的对arr1进行排序:

           Arrays.sort(arr1); 
      

      一旦arr1 被排序,更新arr2 如下:

            for(int ind=0; indx < arr1.length; indx++){
                arr2[indx] = myLocalMap.get(arr1[indx]).doubleValue();
            }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多