Java:排序类型Map的地图<string,arraylist <string =“”>&gt; </string,>

时间:2014-08-04 17:05:53

标签: java collections arraylist map

我有一个Map,其中String为Key,ArrayList为Value。 ArrayList基本上是以某种方式链接到键的四个值的列表。

我的示例数据是:

String : [ArrayList<String>] 

"USA":    ["25", "5", "20", "4"]
"India":  ["15", "7", "8", "2"]
"Canada": ["29", "17", "8", "6"]

我需要按照ArrayList中的第一个值按降序对此Map进行排序,使其如下所示:

"Canada": ["29", "17", "8", "6"]
"USA":    ["25", "5",  "20","4"]
"India":  ["15", "7",  "8", "2"]

我正在尝试下面的函数,但它不适用于ArrayList类型的Map值:

public class MapUtil
{
    public static <K, V extends Comparable<? super V>> Map<K, V> 
        sortByValue( Map<K, V> map )
    {
        List<Map.Entry<K, V>> list =
            new LinkedList<Map.Entry<K, V>>( map.entrySet() );
        Collections.sort( list, new Comparator<Map.Entry<K, V>>()
        {
            public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 )
            {
                return (o1.getValue()).compareTo( o2.getValue() );
            }
        } );

        Map<K, V> result = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list)
        {
            result.put( entry.getKey(), entry.getValue() );
        }
        return result;
    }
}

如何修改此功能以达到我的需要?

2 个答案:

答案 0 :(得分:3)

您正在比较整个ArrayList<String>值,但您希望按每个ArrayList中的第一个值进行比较。

您应该执行以下操作:

    public int compare(Map.Entry<String, ArrayList<String>> o1, Map.Entry<String, ArrayList<String>> o2)
    {
        return (o1.getValue().get(0)).compareTo( o2.getValue().get(0) );
    }

当然你应该添加空检查,以防o1.getValue()返回null或空列表。

但是,您应该注意,这会将值比较为字符串(例如&#34; 5&#34;&gt;&#34; 23&#34;),而不是数字。如果你想进行数字比较,你应该将字符串转换为整数,或者首先将它们存储为整数。

答案 1 :(得分:0)

修改下面的代码以达到我的要求。

还必须将Map值更改为ArrayList< Integer>以进行有效排序。

public static <K, V extends Comparable<? super V>> Map<String, ArrayList<Integer>> sortByValue(Map<String, ArrayList<Integer>> map)
    {
        List<Map.Entry<String, ArrayList<Integer>>> list = new LinkedList<Map.Entry<String, ArrayList<Integer>>>(
                map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String, ArrayList<Integer>>>() 
                {
                    public int compare(Map.Entry<String, ArrayList<Integer>> o1,Map.Entry<String, ArrayList<Integer>> o2)
                    {
                        return (o2.getValue().get(0)).compareTo(o1.getValue().get(0));
                    }
                });

        Map<String, ArrayList<Integer>> result = new LinkedHashMap<String, ArrayList<Integer>>();
        for (Map.Entry<String, ArrayList<Integer>> entry : list) 
        {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }