无法按升序对列表进行排序

3
Map<String, String> map ;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();


/////OnCreate.............


function1(){
map = new TreeMap<String, String>();
map.put("id", "id");
map.put("amont", "amount");

list.add(map);

System.out.println(list);
}

id为1、3、5、57、80的输入值:

金额为100、500、200、10、10000的输入值:

无法按照金额的升序排列列表。它仍然按照插入的顺序显示。

如何修复这个问题?感谢任何帮助。提前致谢。

期望输出:按金额升序排序:

amt=10 id=4  
amt=100 id=1  
amt=200 id=3  
amt=500 id=2  
amt=10000 id=5  

检查我的答案和给定的链接,你只能在那里找到答案。如果没有自定义方法,你无法按值对 map 进行排序。 - Manish Srivastava
你好,Manish。我该如何将更改应用于上面的现有代码?能否请您编辑它并加入更改?这会非常有帮助。谢谢。 - jason
抱歉亲爱的!你面前的一切都要自己尝试。没有人会为你做饭。 - Manish Srivastava
5个回答

2
假设这是你的输入。
  Map<String, String> map ;
  List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  map = new TreeMap<String, String>();
  map.put("id","1");
  map.put("amount","100");
  list.add(map);
  map = new TreeMap<String, String>();
  map.put("id","2");
  map.put("amount","500");  
  list.add(map);
  map = new TreeMap<String, String>();
  map.put("id","3");
  map.put("amount","200");
  list.add(map);
  map = new TreeMap<String, String>();
  map.put("id","4");
  map.put("amount","10");
  list.add(map);
  map = new TreeMap<String, String>();
  map.put("id","5");
  map.put("amount","10000");
  list.add(map);

这是您的排序代码。
  Collections.sort(list, new Comparator<Map<String, String>>() {

        @Override
        public int compare(Map<String, String> o1, Map<String, String> o2) {
            String value1 =  o1.get("amount");
            String value2 =  o2.get("amount");
            return Integer.parseInt(value1)-Integer.parseInt(value2);
        }
    });

    for (Map<String, String> map1 : list) {
        String id = map1.get("id");
        String amount = map1.get("amount");
        System.out.println("amount= "+amount + " , " +"id = "+id);
    }

输出

amount= 10 , id = 4
amount= 100 , id = 1
amount= 200 , id = 3
amount= 500 , id = 2
amount= 10000 , id = 5

更新

如果值是小数,使用以下代码替换return Integer.parseInt(value1)-Integer.parseInt(value2);.

return Double.valueOf(value1).compareTo(Double.valueOf(value2));

你好Prabhakaran。感谢您提供代码和时间,但是如果金额有小数点,而不是整数,该怎么办?我指的是浮点数/双精度浮点数。如何进行更改?目前在这一行中出现错误:return Integer.parseInt(value1)-Integer.parseInt(value2);当我将其更改为double时,返回类型出现错误。 - jason
太棒了Prabhakaran,感谢您的代码和+1。我还添加了另一个包含许多lat/lng的字符串到哈希映射中,如何将其再次获取到arraylist中?ArrayList<LatLng> vertices。我使用这个来检索String idlatlng = map1.get("latlng"),但我得到了一个很长的列表。请帮帮我,Phabhakaran。谢谢。 - jason
@jason 很高兴收到你的来信... 你能否提出另一个问题,包括你所期望的输入和输出呢?这样可以更清楚地理解问题,而且很多人会为你的问题提供最佳答案。我也会尽力帮忙... - Prabhakaran Ramaswamy
太棒了,谢谢你的回复。我现在会做同样的事情。我会先尝试自己去完成它。再次感谢你的回复。 - jason
您好,我刚刚发布了问题,请查看。谢谢。 - jason

1
使用sort()函数进行排序。
例如:
list.add(map);
Collections.sort(list)

System.out.println(list)

它现在将按照所包含内容的类型以升序打印列表。

您好Mr.Mittal,但我遇到了以下错误: 边界不匹配:类型Collections的通用方法sort(List<T>)不能适用于参数(List<Map<String,String>>)。推断出的类型Map<String,String>不是< T extends Comparable<? super T>>的有效替代者。 - jason

1

默认情况下,列表未排序。您需要使用Collections.sort()方法,该方法需要使用Comparator。因此,看起来您想按amount进行排序,您应该像下面这样实现比较器。

Collections.sort(list, new Comparator<Map<String, String>>() {
    @Override
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        String amount1 = o1.get("amount");
        String amount2 = o2.get("amount");
        return new Integer(amount1).compareTo(new Integer(amount2));
    }
});

这是完整的工作副本,
List<Map<String, String>> list = new ArrayList<Map<String, String>>();

Map<String, String> map1 = new TreeMap<String, String>();
map1.put("id", "2");
map1.put("amount", "200");

Map<String, String> map2 = new TreeMap<String, String>();
map2.put("id", "1");
map2.put("amount", "100");

Map<String, String> map3 = new TreeMap<String, String>();
map3.put("id", "3");
map3.put("amount", "300");

list.add(map1);
list.add(map2);
list.add(map3);

Collections.sort(list, new Comparator<Map<String, String>>() {
    @Override
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        String amount1 = o1.get("amount");
        String amount2 = o2.get("amount");
        return amount1.compareTo(amount2);
    }
});

System.out.println(list);

它应该打印,
[{amount=100, id=1}, {amount=200, id=2}, {amount=300, id=3}]

你好,JayaMohan。在最后一次比较(排序)之前,它都运行得很好,但是最后一个值没有被排序,仍然停留在原来的位置。 - jason
我已经更新了 compare 方法。你能试一下吗? - Jayamohan
如果您的金额具有小数位,您可以更改比较方式为Double(amount1).compareTo(new Double(amount2))。它适用于整数和小数值。 - Jayamohan
1
你好Jayamohan +1 太棒了!我首先使用了Prabhakaran的可行代码,我会接受他的答案。再次感谢和抱歉。 - jason

1
不可以使用默认排序方法按值缩短任何地图。 您应该编写自定义排序方法。 请参见此链接- TreeMap按值排序 如果要按键排序,我建议使用TreeMap。
谢谢!

你好,Srivastava先生。我看了你的答案,但是我的代码是 <String,String>,而示例是 <String,Integer>。我该如何转换代码呢?如果您能将代码编辑为我上面展示的那种形式,那就太好了。再次感谢您的时间,非常感激。 - jason
1
Map<String,String> map = new TreeMap<String,String>(); map.put("A", "a"); map.put("B", "b");System.out.println(map); - Manish Srivastava

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接