簡體   English   中英

如何使用比較器接口按地圖的字符串鍵對地圖進行排序

[英]How do you sort a Map by its String Keys using comparator interface

我知道以前也曾問過類似的問題,但是我有一個特定的問題,我不能誤解。

我想按星期幾對地圖進行排序,其中星期幾是地圖的關鍵。 您如何在compare方法中比較沒有自然順序的字符串? 排序末尾的地圖應該是:星期一,星期二,星期三,星期四。

到目前為止,這是我的代碼,但是我只能使用compare方法。

    class OpeningTimes {

       private String openingTime;
       private String closingTime;
       public String getOpeningTime() {
           return openingTime;
       }
       public void setOpeningTime(String openingTime) {
           this.openingTime = openingTime;
       }
       public String getClosingTime() {
           return closingTime;
       }
       public void setClosingTime(String closingTime) {
           this.closingTime = closingTime;
       }

       @Override
       public String toString() {
           return new StringBuilder( "Opening Times: " + this.openingTime + " Closing Times: " + this.closingTime).toString();
       }
   }

比較:

class OpeningTimesComparator implements Comparator<Map.Entry<String, OpeningTimes>>{

   @Override
   public int compare(Entry<String, OpeningTimes> o1, Entry<String, OpeningTimes> o2) {
       return 0; // what is the logic?
   }}

亞軍:

public class TestClass {

    public static void main(String[] args) {

        Map<String, OpeningTimes> openingTimesMap = new TreeMap<String, OpeningTimes>();

        OpeningTimes openTime1 = new OpeningTimes();
        openTime1.setOpeningTime("9PM");
        openTime1.setClosingTime("10PM");

        OpeningTimes openTime2 = new OpeningTimes();
        openTime2.setOpeningTime("11PM");
        openTime2.setClosingTime("9PM");

        OpeningTimes openTime3 = new OpeningTimes();
        openTime3.setOpeningTime("13PM");
        openTime3.setClosingTime("14PM");

        OpeningTimes openTime4 = new OpeningTimes();
        openTime4.setOpeningTime("15PM");
        openTime4.setClosingTime("13PM");

        openingTimesMap.put("Tue", openTime2);
        openingTimesMap.put("Thu", openTime4);
        openingTimesMap.put("Mon", openTime1);
        openingTimesMap.put("Wed", openTime3);


        for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
            System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
        }

        List<Map.Entry<String, OpeningTimes>> list = new ArrayList<Map.Entry<String, OpeningTimes>>(openingTimesMap.entrySet());

        Collections.sort(list, new OpeningTimesComparator());

        for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
            System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
        }
    }
}

提前致謝

如果您不必使用其他一些包含自定義訂單值的靜態地圖,則枚舉將是一個很好的解決方案。

定義一個這樣的枚舉

enum Week{
  SUN,MON,TUE,WED,THU,FRI,SAT   
}

創建一個EnumMap實例並添加條目,並在keySet進行迭代時,將按枚舉中提到的順序檢索條目

    Map<Week, String> map = new EnumMap<Week, String>(Week.class);

        map.put(Week.WED, "Wednesday");
        map.put(Week.SUN, "Sunday");
        map.put(Week.MON, "Monday");
        map.put(Week.THU, "Thursday");
        map.put(Week.SAT, "Saturday");
        map.put(Week.FRI, "Friday");
        map.put(Week.TUE, "Tuesday");


        for(Week week : map.keySet()){
            System.out.println(week + " -- " +map.get(week));
        }

輸出:

SUN -- Sunday
MON -- Monday
TUE -- Tuesday
WED -- Wednesday
THU -- Thursday
FRI -- Friday
SAT -- Saturday

我在枚舉中定義的順序相同。 當然,僅當Map中的鍵范圍有限時(例如,一周中的幾天), EnumMap才有用且高效。 希望這可以幫助 :)

選項2:-

這是在假設inputKeys完全由您管理的前提下進行的。 請注意這一點,因為如果給定密鑰不存在映射,它可能會給您NPE。

private static Map<String,Integer> orderMappings = new HashMap<>();

    static{
        orderMappings.put("Sunday", 1);
        orderMappings.put("Monday", 2);
        orderMappings.put("Tuesday", 3);
        orderMappings.put("Wednesday", 4);
        orderMappings.put("Thursday", 5);
        orderMappings.put("Friday", 6);
        orderMappings.put("Saturday", 7);
    }

    class OrderComparator implements Comparator<String>{

        @Override
        public int compare(String key1, String key2) {
            int p1 = orderMappings.get(key1);
            int p2 =  orderMappings.get(key2);
            return p1-p2;
        }

    }

暫無
暫無

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

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