gpt4 book ai didi

java - 使用java对HashMap数据进行排序

转载 作者:行者123 更新时间:2023-12-01 07:52:19 25 4
gpt4 key购买 nike

我正在尝试使用以下代码按升序对 HashMap 数据进行排序:

public static void main(String[] args) {

Map<String, String> unsortMap = new HashMap<String, String>();
unsortMap.put("10", "z");
unsortMap.put("5", "b");
unsortMap.put("6", "a");
unsortMap.put("20", "c");
unsortMap.put("1", "d");
unsortMap.put("7", "e");
unsortMap.put("8", "y");
unsortMap.put("99", "n");
unsortMap.put("50", "j");
unsortMap.put("2", "m");
unsortMap.put("9", "f");

System.out.println("Unsort Map......");
printMap(unsortMap);

System.out.println("\nSorted Map......");
Map<String, String> treeMap = new TreeMap<String, String>(unsortMap);
printMap(treeMap);

}

public static void printMap(Map<String, String> map) {
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey()
+ " Value : " + entry.getValue());
}
}

该程序的输出:

Sorted Map......
Key : 1 Value : d
Key : 10 Value : z
Key : 2 Value : m
Key : 20 Value : c
Key : 5 Value : b
Key : 50 Value : j
Key : 6 Value : a
Key : 7 Value : e
Key : 8 Value : y
Key : 9 Value : f
Key : 99 Value : n

预期输出:

Sorted Map......
Key : 1 Value : d
Key : 2 Value : m
Key : 5 Value : b
Key : 6 Value : a
Key : 7 Value : e
Key : 8 Value : y
Key : 9 Value : f
Key : 10 Value : z
Key : 20 Value : c
Key : 50 Value : j
Key : 99 Value : n

我知道如果我在数字上使用字符(例如 1 作为“A”,2 作为“C”,.. 99 作为“E”),那么上面的代码会打印正确的结果。但是为什么当我在键中使用整数作为字符串类型时它不起作用?

最佳答案

key 类型为String ,因此值按字典顺​​序作为字符串存储和比较。各个字符串从左到右进行比较,而不是作为数值进行比较。您得到的输出是对字符串进行排序的正确输出。

如果您希望将值作为整数进行比较,请将通用参数定义为 <Integer,String>或为 TreeMap 实现一个新的比较器将字符串转换为整数以进行比较。

这是一个示例比较器

public static class StringAsNumberComparator implements Comparator<String>
{
public static class StringAsNumberComparator implements Comparator<String>
{
@Override
public int compare(String o1, String o2)
{
/*
* A string compares equal to itself, and two null values are also equal.
* Note that we *really DO* want to use reference comparison here instead of String.equals().
* This is an optimization to detect a string being compared to itself (not another string
* that happens to contain the same value).
*/
if (o1 == o2) return 0; // A string compares equal to itself
/*
* Also we DO NOT do this:
*
* if (o1 != null && o2 != null && o1.equals(o2)) return 0;
*
* with the goal of detecting equal-valued because we want all strings to go
* through the conversion below, where null and invalid numbers are detected
* and mapped to Integer.MIN_VALUE so they'll sort to the front.
*/

int temp1, temp2;

/*
* Convert the first string into a number for comparison.
* If the first string is null or not a valid number make it sort to the beginning
*/
try {
temp1 = o1==null ? Integer.MIN_VALUE : Integer.parseInt(o1);
} catch (NumberFormatException nx) {
temp1 = Integer.MIN_VALUE;
}

/*
* Convert the second string into a number for comparison.
* If the second string is null or not a valid number make it sort to the beginning
*/
try {
temp2 = o2==null ? Integer.MIN_VALUE : Integer.parseInt(o2);
} catch (NumberFormatException nx) {
temp2 = Integer.MIN_VALUE;
}

/*
* Do the actual comparison
*/
return Integer.compare(temp1, temp2);
}
}

您需要按如下方式修改代码

    System.out.println("\nSorted Map......");
Map<String, String> treeMap = new TreeMap<>(new StringAsNumberComparator()); // <=== different constructor to set Comparator
treeMap.putAll(unsortMap); // <=== Here's where you copy the elements in
printMap(treeMap);

一个可能的增强功能是参数化比较器,以便您可以为其指定用于无效或空字符串的值,以使它们排序到开头( Integer.MIN_VALUE )或结尾( Integer.MAX_VALUE )。我将把它作为练习。

关于java - 使用java对HashMap数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35147156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com