2012-08-28 12 views
6

Jak mogę sortować android.util.SparseArray? E.g. Mam SparseArray z:
1 - 2,33
5 - 1,5
Wynik:
5 - 1,5
1 - 2,33Sortuj SparseArray w Androidzie

Dzięki !!!

- EDYTOWANA

Używam mapy. Dzięki za pomoc.

+2

Dlaczego chcesz, aby je uporządkować? Klucze się nie zmieniają, a 'SparseArray' nie implementuje' Iterable'. – nkr

+2

"Iterable" to nie tyle kwestia, ale zgodziłbym się, że jeśli celem jest posortowanie tej struktury danych, wspólne struktury danych Javy, takie jak podklasa 'Map ', miałyby większy sens. Nie można powiedzieć, że nie można sortować 'SpareArray' w pożądany sposób, ale to więcej pracy niż przy użyciu gotowego rozwiązania. – Tom

+0

@Tom: Tak, powinien użyć innej struktury danych. Nawet, gdy uda mu się posortować 'SparseArray', nie będzie w stanie uzyskać wartości w odpowiedniej kolejności od niego. – nkr

Odpowiedz

0

Sądząc po źródłowym kodzie źródłowym dla SparseArray.java, nie będzie można tego zrobić po prostu przez wywołanie metody. Wszystko to SpareArray to dwie tablice języka Java, jedna z typu int i jedna z typu Object. Tablice te są prywatnymi zmiennymi instancji i nie można ich odnosić bez Odbicia (co jest niebezpieczne, ponieważ ich nazwy mogą się zmieniać). Dobrym rozwiązaniem może być zlokalizowanie kodu SpareArray w aplikacji i dodanie metody sort przy użyciu zwykłych technik Java, tj. Array.sort.

-5

Odbierz klucze/wartości do list.

   List<Integer>keys = Lists.newArrayList(); 
       List<Integer>vals = Lists.newArrayList(); 
    SparseArray<Integer>arr; 
    for(int i =0; i < arr.size();i++){ 
    keys.add(arr.keyAt(i)); 
    values.add(arr.valueAt(i)); 
    } 
    Collections.sort(keys);// sort 
    Collections.sort(vals); 
    // then fill your array again. 
    arr.clear(); 
    //... 
    arr.put() 
+1

To zdecydowanie prawidłowe podejście, ale jest niebezpieczne z punktu widzenia wydajności. Tworzysz Listy, które nie muszą być tworzone i wywołują metodę po prostu w celu uzyskania elementu tablicy. Ponadto rozmiar jest metodą, a nie polem. – Tom

+6

To zdecydowanie zepsuje mapowanie klawiszy i wartości. – nkr

5

Nie jest jasne, czy żądana klucza lub wartości posortowanych ...

więc tylko uwaga:

poszukiwania binarnego działa tylko na danych segregowanych i SparseArray używa przeszukiwanie binarne dla posortowanej tablicy kluczy (!) zgodnie z the source. Zatem klucze są już posortowane i nie przyjmują innej kolejności, takiej jak kolejność od wartości.

2

Zastosowanie LinkedHashMap jeśli chcesz mapa być klasyfikowane

Aktualizacja:

Można użyć TreeMap. Przechowuje pozycje posortowane według klucza (klucz musi implementować porównywalne).

+1

Twierdzę, że ta odpowiedź jest błędna. 'LinkedHashMap's nie są sortowane same, ani w kluczu, ani w wartości. Zgodnie z [dokumentacją JavaSE 7] (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html) jedyną gwarancją jest zachowanie kolejności iteracji kluczy: "[ ...] zwykle kolejność, w jakiej klucze zostały wstawione do mapy (kolejność wstawiania) ". Nie mówi nic o sortowaniu danych (lub kluczy). – dbm

+1

Co Shayan_Aryan prawdopodobnie oznacza standardową TreeMap lub coś podobnego ConcurrentSkipListMap, zobacz https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html – Karussell

+0

@Karussell tak, dzięki. Właśnie to miałem na myśli. Zaktualizowałem swoją odpowiedź. –

2

Jedna mała nowelizacja @ Karussell za spot-on odpowiedzią jest to, że również dokumentacja sama metody valueAt() sugeruje posortowanych (kluczy):

[...] valueAt(0) zwróci wartość związana z najmniejszym kluczem i valueAt(size()-1) zwróci wartość skojarzoną z największym kluczem.

Podobny opis podano dla metody keyAt().

0

proszę sprawdzić moje rozwiązania, posortowane według klawiszy:

private static SparseIntArray sFactorsMap = new SparseIntArray();  

    private static void sortMap() { 
     SparseIntArray sortedSparseIntArray = new SparseIntArray(); 
     while (sFactorsMap.size() > 0) { 
      int min = Integer.MAX_VALUE; 
      for (int i = 0; i < sFactorsMap.size(); i++) { 
       if (sFactorsMap.keyAt(i) <= min) { 
        min = sFactorsMap.keyAt(i); 
       } 
      } 
      sortedSparseIntArray.put(min, sFactorsMap.get(min)); 
      sFactorsMap.removeAt(sFactorsMap.indexOfKey(min)); 
     } 
     sFactorsMap = sortedSparseIntArray; 
    }