簡體   English   中英

根據多個條件排序 HashMap

[英]Sort HashMap based on multiple conditions

我有一個具有以下結構的 HashMap,

    {val1#val2=val3#val4-val5}

其中鍵 = val1#val2 和值=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");

我有三個條件,我必須將 map 排序為 1. 按 val1。 2. 通過 val2。 3. 通過 val3。

HashMaps 不保證順序,為了得到排序 map 你需要使用 LinkedHashMap。

要對鍵進行排序,您可以使用 java stream api,對 Z1D78DC8ED51214E5AEZ8B5 條目進行排序,然后將它們插入HashMap.

    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());
        });

這應該有效:

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函數,而是可以使用方法引用。

不知道這是否是你想要完成的(澄清需要做什么,我可以調整解決方案),但你可以使用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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM