簡體   English   中英

如何將我的哈希圖數據按升序和降序排序

[英]How can sort my hashmap data in ascending order and also descending order

我有一個HashMap<String, List<String>> myData我希望能夠以升序對我的HashMap進行排序,然后將其放入一個變量中,該變量將用於迭代並添加到excel文件中。 我還想按降序排序,然后將結果存入一個變量,對其進行迭代,然后將數據添加到excel文件中。 我的HashMap如下所示: Aug - 19, {"11", "12"} July- 19, {"01", "22"} Jun - 19, {"77", "02"} May - 19, {"99", "42"}關鍵是日期。 該值只是一個字符串列表。 我需要檢索包含按升序排序的數據的變量,而在另一個變量中按降序排序的數據。 非常感謝您的幫助。

首先將地圖中的鍵轉換為更自然的格式,即日期。 然后將它們存儲在TreeMap中,TreeMap是一個按順序存儲鍵的關聯容器。

使用parse(String)獲取Date對象,然后使用format(Date)重新獲得它的字符串形式。

public class DateAsTreeMapKey {
    public static void main(String[] args) {
        HashMap<String, List<String>> myData = new HashMap<>();

        String format = "MMM - yy";
        myData.put("Aug - 19", Arrays.asList("11", "12"));
        myData.put("July - 19", Arrays.asList("01", "22")); // try out July also
        myData.put("Jun - 19", Arrays.asList("77", "02"));
        myData.put("May - 19", Arrays.asList("99", "42"));      
        printDataInAscendingOrder(getDataInSortedForm(myData, format), format);
        printDataInDescendingOrder(getDataInSortedForm(myData, format), format);

    }
    public static TreeMap<Date, List<String>> getDataInSortedForm(HashMap<String, List<String>> myData, String format) {
        TreeMap<Date, List<String>> mySortedData = new TreeMap<>();
        for (Map.Entry<String, List<String>> entry : myData.entrySet()) {
            String monthYear = entry.getKey();
            List<String> data = entry.getValue();
            try {
                Date date = new SimpleDateFormat(format, Locale.ENGLISH).parse(monthYear);
                mySortedData.put(date, data);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return mySortedData;
    }
    public static void printDataInAscendingOrder(TreeMap<Date, List<String>> mySortedData, String format) {
        System.out.println("Data in ascending order: ");
        for (Entry<Date, List<String>> entry : mySortedData.entrySet()) {
            System.out.println("Month '" + new SimpleDateFormat(format, Locale.ENGLISH).format(entry.getKey())
                    + "' has data as " + entry.getValue().toString());
        }
    }
    public static void printDataInDescendingOrder(TreeMap<Date, List<String>> mySortedData, String format) {
        System.out.println("Data in descending order: ");
        TreeMap<Date, List<String>> mySortedDataReversed = new TreeMap<>(Collections.reverseOrder());
        mySortedDataReversed.putAll(mySortedData);
        for (Entry<Date, List<String>> entry : mySortedDataReversed.entrySet()) {
            System.out.println("Month '" + new SimpleDateFormat(format, Locale.ENGLISH).format(entry.getKey())
                    + "' has data as " + entry.getValue().toString());
        }
    }
}

打印:

Data in ascending order: 
Month 'May - 19' has data as [99, 42]
Month 'Jun - 19' has data as [77, 02]
Month 'Jul - 19' has data as [01, 22]
Month 'Aug - 19' has data as [11, 12]
Data in descending order: 
Month 'Aug - 19' has data as [11, 12]
Month 'Jul - 19' has data as [01, 22]
Month 'Jun - 19' has data as [77, 02]
Month 'May - 19' has data as [99, 42]

這是Java 1.8+流版本。 它可能更有效,但是可能會使示例難以理解,因此我將其留給您。 請注意,排序和倒序之間的唯一區別是.reversed()方法。

import org.junit.jupiter.api.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MapSorter {

    @Test
    public void test() {

        Map<String, List<String>> myData = new HashMap<>();

        myData.put("Aug - 19", Arrays.asList("11", "12"));
        myData.put("July - 19", Arrays.asList("01", "22")); // try out July also
        myData.put("Jun - 19", Arrays.asList("77", "02"));
        myData.put("May - 19", Arrays.asList("99", "42"));

        myData.keySet().stream()
          .map(SortableKey::new)
          .sorted(Comparator.comparingLong(SortableKey::getSortableKey))
          .map(SortableKey::getOriginalKey)
          .forEach(originalKey -> addToExcel(originalKey, myData));
        myData.keySet().stream()
          .map(SortableKey::new)
          .sorted(Comparator.comparingLong(SortableKey::getSortableKey)
                    .reversed())
          .map(SortableKey::getOriginalKey)
          .forEach(originalKey -> addToExcel(originalKey, myData));
    }

    private void addToExcel(String key, Map<String, List<String>> map) {
        System.out.println(key + " = " + map.get(key));
    }

    class SortableKey {

        private String dateStr;
        private long sortableKey;

        SortableKey(String dateStr) {
            this.dateStr = dateStr;
            try {
                sortableKey = new SimpleDateFormat("MMM - yy").parse(dateStr).getTime();
            } catch (ParseException e) {
                // some type of error handling
            }
        }

        long getSortableKey() {
            return sortableKey;
        }

        String getOriginalKey() {
            return dateStr;
        }
    }
}

暫無
暫無

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

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