我有一个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;
}
}
如何修改此功能以达到我的需要?
答案 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;
}