2012-10-10 51 views
6

我有一个Java的双精度数组:arr1,我想对它进行排序。最有可能的第一种选择是效用方法Arrays.sort(double[])对数组进行排序并反映另一个数组中的更改

的想法是,我想同样的变化(例如在index i值在arr1index j互换具有值),以反映在另一个整数数组:arr2(在这个意义上,在相同的索引值被改变也在arr2)。

是否有一个简单的方法(一招)在Java中完成这个?或者唯一的方法是自己实现排序算法?

UPDATE:我看到,人们建议用含有2个值(一个来自arr1和一个从arr2)对象中的一个阵列替换两个阵列。这不会带来一些效率惩罚。换句话说,对一个对象数组进行排序不是比原始类型数组(在这种情况下是双倍)效率低吗?

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

+2

有一个索引数组。不要对值数组排序,对索引数组进行排序。然后使用索引数组来指向两个值数组。请参阅解决方案:http://stackoverflow.com/questions/4859261/get-the-indices-of-an-array-after-sorting – Raihan

+0

http://stackoverflow.com/questions/112234/sorting-matched-array -in-java – talnicolas

+0

这就是所谓的“外部排序”。 –

回答

7

与其尝试维护排序的并行数组,更简洁的解决方案是创建一个封装两个数据值的类,并且只有一个对象数组。 (但是要回答你的问题,在Java中没有内置的方法来实现这一点,实现你自己的排序例程可以让两个数组根据其中一个值排序,这对于少量的数据不太可能改变,但难以维护。)

+0

排序对象数组与排序双精度数组一样高效? – Razvan

+0

@Razvan对一组对象进行排序会非常有效。我怀疑你能够衡量差异。 –

+1

只是想我应该提一下你的新对象的“Comparable”接口。 http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html –

1

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

  • 使用地图存储array[i] -> i
  • 排序数组
  • 迭代数组排序过来,并为每个值,把它作为一个重要的地图检索原始指标。

编辑:Raihan评论让我看起来很惨:(

1

尝试这种方式....

- -使用Arrays.asList()

此转换成arrayArrayList创建另一个List对象引用变量并为其分配相同的ArrayList对象,现在对第一个ArrayList的任何更改都会反映到Se cond 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接口,如果你想只有1路排序。

-使用java.util.Comparator接口,如果你想在多于一种方式进行排序。

0

请注意你在找什么,但另一个解决方法可能是这样的。

创建一个映射,以保持arr1arr2 elments

 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(); 
     } 
相关问题