10

我有一个双打数组,在 Java 中:arr1我想对其进行排序。最有可能的第一个选项是实用程序方法Arrays.sort(double[])

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

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

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

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

4

4 回答 4

10

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

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

于 2012-10-10T16:53:31.630 回答
1

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

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

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

于 2012-10-10T16:54:05.480 回答
1

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

-将其转换arrayArrayList使用Arrays.asList()

-创建另一个列表对象引用变量并将相同的 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 种方式对其进行排序,请使用界面。

于 2012-10-10T16:55:21.330 回答
0

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

arr1创建一个地图来维护和arr2元素之间的关系

      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();
      }
于 2012-10-10T16:59:17.900 回答