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!

user1008697
źródło
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.

Tomasz Nurkiewicz
źródło
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.

Kal
źródło
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).

Roshnal
źródło
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.

Dave Newton
źródło
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.

JB Nizet
źródło
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);
}
BERGUIGA Mohamed Amine
źródło
3

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

Map <String, String> map = new TreeMap <String, String>();
Saurabh Prajapati
źródło
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.
Sangeeth
źródło
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");
JavaGeek
źródło