Java 如何对地图进行排序

Java 如何对地图进行排序,java,string,sorting,map,compare,Java,String,Sorting,Map,Compare,我有一张地图要分类如下: Map<String, String> map = new HashMap(); 它包含以下字符串值: String value = "value1.value2" 其中,键和值可以根据其点段的数量从键1/value1到键1.key2.key3.key4.key5/value1.value2.value3.value4.value5非均匀变化 我需要根据键中存在的点数或调用方法类型键/值中存在的点数对它们进行比较: 或 当然,这些方法将返回一个已排序的

我有一张地图要分类如下:

Map<String, String> map = new HashMap(); 
它包含以下字符串值:

String value = "value1.value2"
其中,键和值可以根据其点段的数量从键1/value1到键1.key2.key3.key4.key5/value1.value2.value3.value4.value5非均匀变化

我需要根据键中存在的点数或调用方法类型键/值中存在的点数对它们进行比较:

当然,这些方法将返回一个已排序的映射


任何帮助都将不胜感激。

对于初学者,您需要使用SortedMap的实例。如果映射没有实现该接口,那么它有一个未定义/任意的迭代顺序,您无法控制它。通常情况就是这样,因为映射是将值与键关联的一种方式;订购是一个辅助问题

所以我假设您正在使用,这是规范的排序映射实现。这将根据您可以在构造函数中提供的值对其键进行排序。因此,如果您可以编写这样一个比较器来确定任意两个键中的较低者:可以,这将很容易实现

但是,这仅在按键排序时起作用。我不知道按值对地图排序是否有意义,我也不知道有什么简单的方法可以做到这一点。我能想到的最好方法是编写一个比较器,对值进行排序,调用Map.getEntrySet并将所有条目推送到一个列表中,然后在列表中调用Collections.sort。它不是很优雅或高效,但如果性能不是你最关心的,它应该完成工作


还要注意的是,如果您的密钥不是不可变的,您将遇到很多麻烦,因为当外部更改时,它们不会被重新调用。

对于初学者,您需要使用SortedMap的实例。如果映射没有实现该接口,那么它有一个未定义/任意的迭代顺序,您无法控制它。通常情况就是这样,因为映射是将值与键关联的一种方式;订购是一个辅助问题

所以我假设您正在使用,这是规范的排序映射实现。这将根据您可以在构造函数中提供的值对其键进行排序。因此,如果您可以编写这样一个比较器来确定任意两个键中的较低者:可以,这将很容易实现

但是,这仅在按键排序时起作用。我不知道按值对地图排序是否有意义,我也不知道有什么简单的方法可以做到这一点。我能想到的最好方法是编写一个比较器,对值进行排序,调用Map.getEntrySet并将所有条目推送到一个列表中,然后在列表中调用Collections.sort。它不是很优雅或高效,但如果性能不是你最关心的,它应该完成工作


还要注意,如果您的键不是不可变的,您将遇到很多麻烦,因为它们在外部更改时不会被重新调用。

您应该使用树形图并实现ValueComparator,或者使实现的键和值对象具有可比性

这里一定是复制品


编辑:复制以仅命名一个

您应该使用树形图并实现ValueComparator,或者使实现可比较的键和值对象

这里一定是复制品


编辑:重复命名一个

无法在HashMap上强加任何排序

如果要通过比较键对元素进行排序,请在键上使用a和some,或者只使用它们的默认排序


如果要按值排序,唯一的实际选择是使用LinkedHashMap,它保留条目放入映射的顺序,然后在将条目插入映射之前对条目进行排序,或者使用一些非JDK映射实现。有一些肮脏的黑客使得一个键比较器实际上秘密地比较了值,但这些都是危险的,并且经常导致不可预测的行为。

没有办法在HashMap上强加任何排序

如果要通过比较键对元素进行排序,请在键上使用a和some,或者只使用它们的默认排序


如果要按值排序,唯一的实际选择是使用LinkedHashMap,它保留条目放入映射的顺序,然后在将条目插入映射之前对条目进行排序,或者使用一些非JDK映射实现。有一些卑鄙的黑客使得一个密钥比较器实际上秘密地比较了值,但这些都是危险的,并且经常导致不可预测的行为。

我是通过以下方法实现的:

@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map sortMap(Map unsortedMap) {

    List list = new LinkedList(unsortedMap.entrySet());
    // sort list based on comparator
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
            String value1 = (String)((Map.Entry) (o1)).getValue();
            String value2 = (String)((Map.Entry) (o2)).getValue();
            // declare the count
            int count1 = findOccurances(value1, '.');
            int count2 = findOccurances(value2, '.');
            // Go to thru the comparing
            if(count1 > count2){
                return -1;
            }
            if(count1 < count2){
                return 1;
            }
            return 0;
        }
    });

    // put the sorted list into map again
    Map sortedMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
        sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}
使用以下帮助器方法:

private static int findOccurances(String s, char chr) {
    final char[] chars = s.toCharArray();
    int count = 0;
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == chr) {
            count++;
        }
    }
    return count;
}
在这里,我可以在比较部分加上一个int参数,在asc/desc之间进行切换


我可以通过切换另一个int参数值在值和键之间进行切换,以获得答案。

我通过以下方法实现了这一点:

@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map sortMap(Map unsortedMap) {

    List list = new LinkedList(unsortedMap.entrySet());
    // sort list based on comparator
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
            String value1 = (String)((Map.Entry) (o1)).getValue();
            String value2 = (String)((Map.Entry) (o2)).getValue();
            // declare the count
            int count1 = findOccurances(value1, '.');
            int count2 = findOccurances(value2, '.');
            // Go to thru the comparing
            if(count1 > count2){
                return -1;
            }
            if(count1 < count2){
                return 1;
            }
            return 0;
        }
    });

    // put the sorted list into map again
    Map sortedMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
        sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}
W 使用以下帮助器方法:

private static int findOccurances(String s, char chr) {
    final char[] chars = s.toCharArray();
    int count = 0;
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == chr) {
            count++;
        }
    }
    return count;
}
在这里,我可以在比较部分加上一个int参数,在asc/desc之间进行切换


我可以通过切换另一个int参数值在值和键之间进行更改以获得答案。

映射是一个关联容器,谈论对其进行排序是没有意义的…您的方法的预期返回类型是什么?已经有一个关于它的线程:但没有可接受的答案,所以我在这里发布了我的来获取答案一个映射是一个关联容器,谈论排序是没有意义的…你的方法的预期返回类型是什么?已经有一个关于它的线程:但是没有被接受的答案,所以我在这里发布了我的来获取答案
private static int findOccurances(String s, char chr) {
    final char[] chars = s.toCharArray();
    int count = 0;
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == chr) {
            count++;
        }
    }
    return count;
}