【问题标题】:Unable to sort the list by ascending order无法按升序对列表进行排序
【发布时间】:2013-10-16 08:29:50
【问题描述】:
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 的输入值

amount=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  

【问题讨论】:

  • 检查我的答案并给出链接,您只会在那里得到答案。如果没有任何自定义方法,您将无法按值对地图进行排序。
  • 你好 Manish 我如何将更改应用到上面的现有代码中。请您编辑更改。这会很有帮助。谢谢
  • 对不起,亲爱的!你面前的一切只是自己尝试。没有人会为你做饭。

标签: java android sorting arraylist treemap


【解决方案1】:

使用排序()

例如:

list.add(map);
Collections.sort(list)

System.out.println(list)

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

【讨论】:

  • 您好,Mittal 先生,但我收到以下错误:绑定不匹配:Collections 类型的泛型方法 sort(List) 不适用于参数 (List>)。推断的类型 Map 不是有界参数 >
【解决方案2】:

不。您不能使用默认排序方法根据值缩短任何地图。 您应该编写自定义的排序方法。 看到这个链接- TreeMap sort by value

如果你想按键排序,我建议使用树形图。

谢谢!

【讨论】:

  • 你好 Mr.Srivastava 我检查了你的答案,但我有 示例是 我应该如何转换代码。另外,如果你可以将代码编辑为我已经在上面展示了它会很有帮助。再次感谢您抽出宝贵的时间非常感谢它。
  • 地图 map = new TreeMap(); map.put("A", "a"); map.put("B", "b"); System.out.println(map);
【解决方案3】:

您必须使用自定义 Comparator 并将其传递给 Treemap 的构造函数。例如,使用以下比较器对它进行排序:

请参阅以下链接。一定能解决你的问题

http://java2novice.com/java-collections-and-util/treemap/comparator-user-object/

【讨论】:

    【解决方案4】:

    默认情况下,列表未排序。您需要采用ComparatorCollections.sort() 方法。所以看起来你想按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 。它工作正常,直到最后一次比较(排序)最后一个值没有排序它仍然保持在相同的位置。
    • 我更新了compare 方法。你能试试吗?
    • 如果您的金额有十进制数字,您可以将比较更改为Double(amount1).compareTo(new Double(amount2))。它适用于 int 和 decimal 值
    • 你好 Jayamohan +1 太棒了!我首先使用了 Prabhakaran 的工作代码,我会接受他的回答。再次感谢。抱歉。
    【解决方案5】:

    假设这是您的输入

      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。感谢您提供代码和时间,但是如果金额有小数点我的意思是它不是 int 而是 float/double 怎么办。目前如何进行更改我在这一行返回错误Integer.parseInt(value1)-Integer.parseInt(value2);当我将其更改为 double 时,返回类型出现错误。
    • Awesome Prabhakaran 感谢您的代码和 +1。此外,我在哈希图中添加了另一个包含大量 lat/lng 的字符串,我将如何将它再次放入 arraylist。ArrayList 顶点。使用它来检索字符串 idlatlng = map1.get("latlng");但我得到了一个很长的清单。请帮助 Phabhakaran。谢谢。
    • @jason 很高兴收到您的来信....请您用您的首选输入和预期输出提出另一个问题....所以很容易理解问题,另一件事很多人们会给你的问题最好的答案。我也会尽力而为.....
    • 太棒了,谢谢你现在也会这样做。我会先尝试自己做。再次感谢您的回复。
    • 您好先生,我刚刚发布了这个问题。请查看它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多