[英]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.