Java: сортировать массив1 на основе массива2 - PullRequest
0 голосов
/ 05 мая 2011

Спасибо за помощь от Zirak В моем предыдущем посте я реализовал следующее в 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)? Большое спасибо

Ответы [ 4 ]

4 голосов
/ 05 мая 2011
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. Объект Comparator используется как функция обратного вызова в JavaScript.

3 голосов
/ 05 мая 2011

Попробуйте использовать 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

Чтобы отсортировать массив и получить новый порядок предыдущих индексов, вы можете перебрать массив и добавить индексы как целочисленные объекты на карту:

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.

1 голос
/ 26 июля 2015
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(); 
            }
    }
}
0 голосов
/ 05 мая 2011

В ответ на вторую часть вашего вопроса: Arrays.sort в Java гарантировал O (n log n) сложность времени, как указано в API .

...