2011-05-05 40 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(); 
      } 
    } 
}