java:基于array2排序array1

感谢Zirak的帮助在我之前的post中,我在JavaScript中实现了以下内容:

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实现吗? 我只能想到实现Comparable接口,如下所示:

 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许多Objs,还有另一种方法可以更简单地实现吗? 另一个问题是,如果我执行上述方法,那么在java和JavaScript中排序的时间复杂度是否都是O(n^2) ? 非常感谢

 public class MyComparator implements Comparator { @Override public int compare(Integer i1, Integer i2) { return arr2[i1.intValue()].compareTo(arr2[i2.intValue()]); } } Arrays.sort(arr1, new MyComparator()); 

这相当于JavaScript排序。 Comparator对象用作JavaScript中使用的回调函数。

尝试使用TreeMap (假设您要对整数进行排序),这意味着所有条目都按其字符串键排序:

 SortedMap map = new TreeMap(); map.put("ac", 0); map.put("bc", 1); map.put("ad", 2); map.put("e", 3); for( Map.Entry 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 map = new TreeMap(); for( int i = 0; i < input.length; ++i ) { map.put(input[i], i); //or use values from another array, eg map.put(inputKeys[i], inputValues[i]); } 

如果您需要通过除自然顺序之外的任何其他内容对键进行排序,则可以将Comparator添加到TreeMap构造函数中。

 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 

回答您的第二部分问题:Java中的Arrays.sort保证了O(n log n)时间复杂度,如API中所指定。