2012-08-17 7 views

Odpowiedz

8

Załóżmy, że twoje elementy są przechowywane w tablicy.

final int[] arr = // elements you want 
List<Integer> indices = new ArrayList<Integer>(arr.length); 
for (int i = 0; i < arr.length; i++) { 
    indices.add(i); 
} 
Comparator<Integer> comparator = new Comparator<Integer>() { 
    public int compare(Integer i, Integer j) { 
    return Integer.compare(arr[i], arr[j]); 
    } 
} 
Collections.sort(indices, comparator); 

Teraz indices zawiera indeksy tablicy w uporządkowanej kolejności. Możesz przekonwertować to z powrotem na int[] z prostą pętlą for.

+0

Guava-er bardzo fajne! –

+0

W pewnym momencie powstrzymałem się od używania Guawy, będę o tym wiedział;) –

1
import java.util.*; 
public class Testing{ 
    public static void main(String[] args){ 
     int[] arr = {3, 2, 4, 6, 5}; 
     TreeMap map = new TreeMap(); 
     for(int i = 0; i < arr.length; i++){ 
      map.put(arr[i], i); 
     } 
     System.out.println(Arrays.toString(map.values().toArray())); 
    } 
} 
+0

Głosujcie. Ale problem polega na tym, że powielane elementy nie są dozwolone w kluczach mapy. –

+0

@Shengyuan Lu Masz rację co do duplikatów. Gdyby wprowadzono {3, 2, 4, 3, 3}, mój wynik byłby [1,4,2], a wynik Louisa Wassermana byłby [1,0, 3,4,2]. Zastanawiam się, który z użytkowników 491880 lubi? – rickz

1

Jednym ze sposobów osiągnięcia tego jest utworzenie listy par z indeksem początkowym jako drugiej części pary. Posortuj listę par leksykograficznie, a następnie odczytaj pozycje początkowe z posortowanej tablicy.

początkowy tablicy:

[3,2,4] 

Dodawanie par indeksami wyjściowego:

[(3,0), (2,1), (4,2)] 

układać lexicographically

[(2,1), (3,0), (4,2)] 

następnie odczytuje się z drugiej części z każdej pary

[1,0,2] 
0
import java.io.*; 

public class Sample { 
    public static void main(String[] args) { 
     int[] data = {0, 3, 2, 4, 6, 5, 10};//case:range 0 - 10 
     int i, rangeHigh = 10; 
     int [] rank = new int[rangeHigh + 1]; 
     //counting sort 
     for(i=0; i< data.length ;++i) ++rank[data[i]]; 
     for(i=1; i< rank.length;++i) rank[i] += rank[i-1]; 
     for(i=0;i<data.length;++i) 
      System.out.print((rank[data[i]]-1) + " ");//0 2 1 3 5 4 6 
    } 
} 
+0

Włączenie takiego przypadku, o którym już wiesz, jest po prostu liczbą w zakresie danych. – BLUEPIXY

0

Aktualizacja jest stosunkowo łatwa w Java 8 przy użyciu API strumieni.

public static int[] sortedPermutation(final int[] items) { 
    return IntStream.range(0, items.length) 
    .mapToObj(value -> Integer.valueOf(value)) 
    .sorted((i1, i2) -> Integer.compare(items[i1], items[i2])) 
    .mapToInt(value -> value.intValue()) 
    .toArray(); 
} 

To nieco niestety wymaga boks i unboxing krok dla indeksów, ponieważ nie ma .sorted(IntComparator) metoda na IntStream lub nawet IntComparator funkcjonalny interfejs dla tej sprawy.

Uogólniając Do List z Comparable obiektów jest dość prosta:

public static <K extends Comparable <? super K>> int[] sortedPermutation(final List<K> items) { 
    return IntStream.range(0, items.size()) 
    .mapToObj(value -> Integer.valueOf(value)) 
    .sorted((i1, i2) -> items.get(i1).compareTo(items.get(i2))) 
    .mapToInt(value -> value.intValue()) 
    .toArray(); 
} 
Powiązane problemy