【问题标题】:Get Max Value from List in Java从Java中的列表中获取最大值
【发布时间】:2020-11-28 01:39:28
【问题描述】:

我有一个如下列表

List{        
{Type=A, Amt=30000},{Type=A, Amt=50000},{Type=B, Amt=40000},{Type=B,Amt=60000},{Type=C,spRqstAmt=50000},{Type=C,Amt=10000}
}

我需要打印每种类型的最大数量。

输出:

类型:A, 金额:50000

类型:B, 金额:60000

类型:C, 金额:50000

如何做到这一点?

【问题讨论】:

  • 可以使用HashMap来存储Type作为key,Amt作为value
  • 我认为this answer 非常适合您的情况
  • 我们不是家庭作业写作服务。

标签: java arrays list sorting arraylist


【解决方案1】:

检查下面的代码。这应该适合你。也可能有其他方法,这是使用 HashMap。

数据类

class Data{
    String type;
    int amt;
    
    Data(String s , int a){
        this.type = s;
        this.amt = a;
    }
}

实现类:

        Data data1 = new Data("A",30000);
        Data data2 = new Data("A",50000);
        Data data3 = new Data("B",40000);
        Data data4 = new Data("B",60000);
        Data data5 = new Data("C",50000);
        Data data6 = new Data("C",10000);
        
        ArrayList<Data> al = new ArrayList<>();
        al.add(data1);
        al.add(data2);
        al.add(data3);
        al.add(data4);
        al.add(data5);
        al.add(data6);
        
        
        
        HashMap<String,Integer> hm = new HashMap<>();
        for (int i = 0; i < al.size(); i++) {
            if(hm.containsKey(al.get(i).type)) {
                int tempAmt = hm.get(al.get(i).type);
                if(al.get(i).amt > tempAmt) {
                    hm.put(al.get(i).type, al.get(i).amt);
                }
            }else {
                hm.put(al.get(i).type,al.get(i).amt);
            }
        }
        
        System.out.println(hm);

【讨论】:

    【解决方案2】:

    假设一个类:

    class DataClass {
      public String type;
      public Integer amt;
    }
    

    你可以:

    HashMap<String, Integer> values = new HashMap<>();
    for (DataClass data : listDatas) {
      if (values.contains(data.type)) {
         int amt = data.get(type);
         if (data.amt > amt) {
           values.put(data.type, data.amt);
         }
      } else {
        values.put(data.type, data.amt);
      }
    }
    

    然后就可以打印结果了。

    【讨论】:

      【解决方案3】:

      假设您的列表包含 Element 类型的对象,使用 toMap 收集器将它们聚合到 map 中,其中类型是键,值冲突已解决以支持最大值:

      Map<String,Integer> m = list.stream().collect(Collectors.toMap(Element::getType, Element::getAmt, Math::max))
      

      (我头脑中的代码,我没有测试过)

      【讨论】:

        【解决方案4】:

        类似于 Tomáš Záluský 的回答,使用流 API,但这样您可以保留 Element 对象,如果您以后需要它们:

        import static java.util.Comparator.comparingInt;
        import static java.util.function.BinaryOperator.maxBy;
        import static java.util.stream.Collectors.toMap;
        
        Map<String, Element> groupByMax = list.stream()
                        .collect(toMap(Element::getType, e -> e, maxBy(comparingInt(Element::getAmt))));
        Collection<Element> elementsWithMaxAmts = groupByMax.values();
        

        【讨论】:

          【解决方案5】:

          在这种情况下没有真正需要使用流。给出以下地图列表:

          List<Map<String, String>> list =
                  List.of(Map.of("Type", "A", "Amt", "30000"),
                          Map.of("Type", "A", "Amt", "50000"),
                          Map.of("Type", "B", "Amt", "40000"),
                          Map.of("Type", "B", "Amt", "60000"),
                          Map.of("Type", "C", "Amt", "50000"),
                          Map.of("Type", "C", "Amt", "10000"));
          

          您可以使用mapmerge方法合并结果。

          Map<String, String> results = new HashMap<>();
          
          for (Map<String, String> m : list) {
              results.merge(m.get("Type"), m.get("Amt"),
                      (a, b) -> Integer.valueOf(a)
                              .compareTo(Integer.valueOf(b)) == 1 ? a :
                                      b);
              
          }
          results.entrySet().forEach(System.out::println);
          

          以显示最大数量的类型打印以下内容。

          A=50000
          B=60000
          C=50000
          

          【讨论】:

            猜你喜欢
            • 2014-01-16
            • 2016-01-21
            • 2022-01-25
            • 1970-01-01
            • 1970-01-01
            • 2022-10-24
            • 1970-01-01
            • 1970-01-01
            • 2018-04-15
            相关资源
            最近更新 更多