Сортировка HashMap на основе нескольких условий - PullRequest
0 голосов
/ 08 мая 2020

У меня есть HashMap со следующей структурой,

    {val1#val2=val3#val4-val5}

, где key = val1 # val2 и value = val3 # val4-val5,

HashMap<String, String> h = new HashMap<String, String>(); 
    h.put("aaa#bbb", "111#444-555");
    h.put("bbb#aaa", "222#ddd-222");
    h.put("111#999", "000#213-aaa");

У меня есть три условия, где Я должен отсортировать карту как 1. По val1. 2. По val2. 3. По val3.

Ответы [ 3 ]

1 голос
/ 08 мая 2020

HashMaps не гарантирует порядок, чтобы получить отсортированную карту, вам нужно использовать LinkedHashMap.

Для сортировки ключей вы можете использовать java stream api, отсортировать записи карты и вставить их в LinkedHashMap.

    Map<String, String> h = new HashMap<>();
    h.put("aaa#bbb", "111#444-555");
    h.put("bbb#aaa", "222#ddd-222");
    h.put("111#999", "000#213-aaa");

    LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
    h.entrySet().stream()
        .sorted(Comparator.comparing(e -> e.getKey().split("#")[0]))// sort by val1
        .sorted(Comparator.comparing(e -> e.getKey().split("#")[1]))// sort by val2
        .sorted(Comparator.comparing(e -> e.getValue().split("#")[0]))// sort by val3
        .forEach(e -> {
            linkedHashMap.put(e.getKey(), e.getValue());
        });
0 голосов
/ 08 мая 2020

Не знаю, хотите ли вы этого sh (поясните, что нужно сделать, и я могу адаптировать решение), но вы можете использовать TreeMap :

import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

public class TestDictionary {
    public static void main(String[] args) {
        Map<Key, Object> map = new TreeMap<>(new Comparator<Key>() {
        @Override
        public int compare(Key o1, Key o2) {
            // do whatever you want here
            return 0;
        }
    });

        map.put(new Key("a", "b", "c"), new Value());
        map.put(new Key("b", "c", "a"), new Value());
        map.put(new Key("c", "b", "a"), new Value());
        System.out.println(map);
    }

    static class Key {
        String val1;
        String val2;
        String val3;

        public Key(String val1, String val2, String val3) {
            this.val1 = val1;
            this.val2 = val2;
            this.val3 = val3;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Key key = (Key) o;
            return val1.equals(key.val1) &&
                   val2.equals(key.val2) &&
                   val3.equals(key.val3);
        }

        @Override
        public int hashCode() {
            return Objects.hash(val1, val2, val3);
        }
    }

    static class Value {
        int number;
    }
}
0 голосов
/ 08 мая 2020

Это должно работать:

public static void main(String[] args) {
    LinkedHashMap<String, String> map = new LinkedHashMap<>();
    map.put("aa#bb", "11111#44-5555555");
    map.put("bb#aa", "22222#ddd-222");
    map.put("11#99", "00000#213-aaa");

    Function<Map.Entry<String, String>, String> byVal1 = 
             entry -> entry.getKey().substring(0, entry.getKey().indexOf('#'));
    Function<Map.Entry<String, String>, String> byVal2 =
             entry -> entry.getKey().substring(entry.getKey().indexOf('#') + 1);
    Function<Map.Entry<String, String>, String> byVal3 =
             entry -> entry.getValue().substring(0, entry.getValue().indexOf('#'));

    // Just change this value to sort by a different value
    Function<Map.Entry<String, String>, String> value = byVal3;

    List<Map.Entry<String, String>> asList = map.entrySet().stream().sorted(Comparator.comparing(value)).collect(Collectors.toList());
    map.clear();
    asList.forEach(entry -> map.put(entry.getKey(), entry.getValue()));

    map.entrySet().stream().forEach(entry -> System.out.println(entry));
}

Вам, конечно, не нужно создавать byValX функции в методе, и вместо этого вы можете использовать ссылки на методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...