2011-05-05 59 views
0

感谢来自Zirak在我previous post帮助我实现了在JavaScript如下:的java:排序阵列1基于数组2

var arr1 =[0,1,2,3]; 
var arr2 =["ac", "bc", "ad", "e"]; 
var result = arr1 .sort(function(i, j){return arr2[i].localeCompare(arr2[j])}) 
document.write(result); 

实现这一目标是在JavaScript相当紧凑的方式,可以在Java实现这个也是通过这样简单来实现的吗?我只能想到实现像可比界面如下:

public class testCompare { 
    public static String[] arr2={"ac", "bc", "ad", "e"}; 
    public static Obj[] arr1={new Obj(0), new Obj(1), new Obj(2), new Obj(3)}; 
    static class Obj implements Comparable{ 
      int index=0; 
      public Obj(int i){ 
        index=i; 
      } 
      @Override 
      public int compareTo(Object o) { 
        return arr2[index].compareTo(arr2[((Obj)o).index]); 
      } 
    } 
} 

但如果数组有X的许多项目,那么我将不得不创建X许多OBJ文件,有另一种方式,我可以做到这一点更简单?另一个问题是,如果我采用上述方法,在java和JavaScript中排序的时间复杂度是多少,它们都是O(n^2)?非常感谢

回答

4
public class MyComparator implements Comparator<Integer> { 
    @Override 
    public int compare(Integer i1, Integer i2) { 
     return arr2[i1.intValue()].compareTo(arr2[i2.intValue()]); 
    } 
} 

Arrays.sort(arr1, new MyComparator()); 

这相当于JavaScript排序。由于在JavaScript中使用回调函数,因此使用Comparator对象。

+0

这很好,非常感谢 – user685275 2011-05-05 14:05:46

+0

我不明白这一点。不是i1和i2是arr1的值,你将它们当作arr1的索引。 – Haider 2016-11-11 17:26:33

+0

@Haider是的,这就是OP所要求的。当比较1和2时,他想比较“bc”和“ad”,因为“bc”在索引1,“ad在索引2”。 – 2016-11-11 17:33:30

0

在回答你的第二部分的问题:Arrays.sort在Java已经保证为O(n log n)的时间复杂度,按规定in the API

+0

是的,内部的java正在使用一个QuickSort插入排序的叶节点 – Voo 2011-05-05 13:57:54

+0

这太好了,非常感谢 – user685275 2011-05-05 14:07:02

+0

@Voo:afaik这不是真的:1)API说,实际的算法取决于具体的实现,至少在我的机器上它使用了合并排序的一个版本2)quicksort并不保证* O(n log n)*,而是最坏情况的运行时间是* O(n^2)* – dcn 2011-05-05 14:30:08

3

尝试使用TreeMap<String, Integer>(假设要排序的整数),这意味着所有的条目由它们的字符串键排序:

SortedMap<String, Integer> map = new TreeMap<String, Integer>(); 
map.put("ac", 0); 
map.put("bc", 1); 
map.put("ad", 2); 
map.put("e", 3); 

for(Map.Entry<String, Integer> entry : map.entrySet()) 
{ 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 
} 

输出:

ac - 0 
ad - 2 
bc - 1 
e - 3 

要排序的数组,并获得您可以遍历数组并将索引作为Integer对象添加到地图中:

String[] input = {"ab", "bc", "ad" , "e" }; 
SortedMap<String, Integer> map = new TreeMap<String, Integer>(); 
for(int i = 0; i < input.length; ++i) 
{ 
    map.put(input[i], i); //or use values from another array, e.g. map.put(inputKeys[i], inputValues[i]); 
} 

如果您需要按除自然顺序以外的任何其他顺序排序键,则可以将Comparator<String>添加到TreeMap构造函数中。

+0

感谢您的回答,非常感谢 – user685275 2011-05-05 14:07:46

+0

一个重要提示:如果在原始数组中有任何重复条目,则它们将在此方法中丢失,仅由具有该值的最后一个条目表示。 – 2016-05-25 20:57:27

1
public class SortA1byA2array 
{ 
public static void main (String[] args) 
{ 
int[] arr1={2,1,2,5,7,1,9,8,3,6,8,8};  
int[] arr2={2,1,8,3}; 
TreeMap hm=new TreeMap(); 
int count=1; 
     for(int i=0;i<arr1.length;i++){ 
      if(hm.containsKey(arr1[i])){ 
       hm.put(arr1[i], ++count); 
      } 
      else{ 
       count=1; 
       hm.put(arr1[i],count); 
      } 
     } 


     for(int i=0;i<arr2.length;i++){ 
      if(hm.containsKey(arr2[i])){ 
       for(int j=0;j<(Integer)hm.get(arr2[i]);j++){ 
        System.out.println(arr2[i]); 
       } 
       hm.remove(arr2[i]); 
      } 
     } 

     Iterator it = hm.entrySet().iterator(); 
      while (it.hasNext()) { 
       Map.Entry pairs = (Map.Entry)it.next(); 
       System.out.println(pairs.getKey()); 
       it.remove(); 
      } 
    } 
}