簡體   English   中英

根據地圖的字符串鍵的數值對它們進行排序

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

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