我有一个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"}关键字是日期。值只是一个字符串列表。我需要检索包含按升序排序的数据的变量,并在另一个变量中检索按降序排序的数据。非常感谢你的帮助。
发布于 2019-09-17 09:41:42
首先,将map中的键转换为更自然的格式,即日期。然后将它们存储在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]发布于 2019-09-17 10:51:48
这是一个java 1.8+流版本。它可以更高效,但这可能会使示例变得模糊,所以我把这个问题留给您。请注意,to排序和反向排序之间的唯一区别是.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;
}
}
}https://stackoverflow.com/questions/57965951
复制相似问题