![](/img/trans.png)
[英]Sorting a list of Map<String, String> based on a particular numeric value
[英]Sorting String keys of a Map according to their numeric value
我需要編寫一個處理Map<String, String[]>
,根據其數字順序處理其鍵。 為了增加侮辱性傷害,某些鍵不是有效的整數,並且應按字母順序將它們最后處理。
例如,如果鍵是:
["10", "2", "100", "duck", "black"]
他們應該按此順序進行迭代-
["2", "10", "100", "black", "duck"]
除了迭代和嘗試捕捉NumberFormatException
之外,用Java做到這一點的最優雅的方法是什么? 顯然,我無法控制給定地圖的格式。
由於您需要以特定順序進行迭代,而不是輸入映射的自然順序,因此您需要將其轉儲到另一個映射(如果不需要每個鍵的關聯值,則將其轉儲到列表中)。 將TreeMap
與自定義比較器一起使用:
class NumbersThenWordsComparator implements Comparator<String> {
private static Integer intValue(String s) {
try {
return Integer.valueOf(s);
} catch (NumberFormatException e) {
return null;
}
}
@Override
public int compare(String s1, String s2) {
Integer i1 = intValue(s1);
Integer i2 = intValue(s2);
if (i1 == null && i2 == null) {
return s1.compareTo(s2);
} else if (i1 == null) {
return -1;
} else if (i2 == null) {
return 1;
} else {
return i1.compareTo(i2);
}
}
}
public void myMethod(Map<String, String[]> originalMap) {
TreeMap<String, String[]> t =
new TreeMap<String, String[]>(new NumbersThenWordsComparator());
t.putAll(originalMap);
// now iterate over t, which will produce entries in the desired order
}
使用SortedMap
,它根據鍵的自然順序對鍵進行排序。 對於字符串,它是字典式的。 我不確定數字是否在字母之前,但是無論哪種方式排序都將定義良好且一致,因此您可以正確地處理它以獲取數字的第一個或最后一個(即執行類似ArrayList<String> keys = yourMap.keySet()
如果不是第一個數字字符串,則對其進行修改)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.