Sortowanie hashmap na podstawie kluczy


79

Mam następujący hashmap w javie:

{B046 = 0,0, A061 = 3,0, A071 = 0,0, B085 = 0,0, B075 = 3,0, B076 = 9,0, B086 = 3,0, B095 = 0,0, B096 = 0,0, A052 = 0,0, B066 = 0,0, B056 = 9,0, B065 = 0,0, B055 = 9,0}

Jak mam posortować hashmap tak, aby brany był pod uwagę alfabet, po którym następują cyfry?

Wynikowy hashmap powinien wyglądać następująco:

{A052 = 0,0, A061 = 3,0, A071 = 0,0, B046 = 0,0, B055 = 9,0, B056 = 9,0, B065 = 0,0, B066 = 0,0, B075 = 3,0, B076 = 9,0, B085 = 0,0, B086 = 3,0, B095 = 0,0, B096 = 0,0}

Doceń pomoc!


3
hashmap służy do wyszukiwania. Haszuje rzeczy. Nie utrzymuje porządku.
Muhammad Hasan Khan

2
@HasanKhan .. kto nawet o to zapytał?
eRaisedToX

Odpowiedzi:


239

Użyj posortowane TreeMap:

Map<String, Float> map = new TreeMap<>(yourMap);

Automatycznie umieści wpisy posortowane według kluczy. Myślę, że naturalne Stringporządkowanie będzie w Twoim przypadku w porządku.

Zauważ, że HashMapze względu na optymalizacje wyszukiwania nie zachowuje porządku.


Cześć @Tomasz Nurkiewicz Jak mogę uzyskać odwrotną kolejność?
Raghavendra

Czy mogę zastosować własny komparator
Fakher

Świetne rozwiązanie! Jest jeden błąd z numerami 2-cyfrowymi, sortowanie to 1, 10, 11,12,2,3,4,5. Czy jest na to jakieś rozwiązanie?
Rachita Nanda

@RachitaNanda, Możesz spróbować zapisać cyfry za pomocą Integer niż string.
Krishna

27

Użyj TreeMap z niestandardowym komparatorem.

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

W miarę dodawania nowych elementów będą one automatycznie sortowane.

W twoim przypadku implementacja komparatora może nawet nie być konieczna, ponieważ porządkowanie String może być wystarczające. Ale jeśli chcesz zaimplementować specjalne przypadki, takie jak małe litery alfabetu pojawiają się przed dużymi literami lub traktuje liczby w określony sposób, użyj komparatora.


11

TreeMapjest najlepszym rozwiązaniem dla tego rodzaju sortowania (Naturalne). TreeMapnaturalnie sortuje według kluczy.

HashMapnie zachowuje kolejności reklamowej ani nie sortuje mapy. LinkedHashMapzachowuje kolejność reklam, ale nie sortuje mapy automatycznie. Tylko TreeMapw Mapinterfejsie sortuje mapę zgodnie z naturalną kolejnością (najpierw cyfry, wielkie litery na drugim, małe litery na końcu).


5

Użyj TreeMap , chociaż posiadanie mapy „tak wyglądającej” jest trochę niejasne - możesz także po prostu posortować klucze na podstawie kryteriów i iterować po mapie, pobierając każdy obiekt.


3

Po prostu użyj TreeMap. Implementuje SortedMapinterfejs, a tym samym automatycznie sortuje zawarte w nim klucze. Twoje klucze można po prostu posortować alfabetycznie, aby uzyskać pożądany wynik, więc nie musisz nawet podawać porównania.

HashMapy nigdy nie są sortowane. Jedyną rzeczą, którą możesz zrobić z HashMap, jest pobranie wszystkich kluczy i zapisanie ich w posortowanym zestawie lub na liście i posortowanie listy.


3

Używając TreeMap możesz sortować Mapę.

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}

3

Możesz użyć, TreeMapktóry będzie przechowywać wartości w posortowanej formie.

Map <String, String> map = new TreeMap <String, String>();

2

Użyj TreeMap (Konstruktor):

Map<String, Float> sortedMap = new TreeMap<>(yourMap);

Użyj TreeMap (metoda PutAll):

Map<String, Float> sortedMap = new TreeMap<>();
sortedMap.putAll(yourMap);

Implementacja interfejsu Map:

  1. TreeMap - automatycznie sortuj klucze w kolejności rosnącej podczas wstawiania.
  2. HashMap - kolejność wstawiania nie zostanie zachowana.
  3. LinkedHashMap - kolejność wstawiania zostanie zachowana.

1

TreeMap automatycznie posortuje w kolejności rosnącej. Jeśli chcesz posortować w kolejności malejącej, użyj następującego kodu:

Skopiuj poniższy kod w swojej klasie i poza główną metodą wykonywania:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Następnie w swojej logice:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.