【问题标题】:sort by name and then add amount of each object with same name?按名称排序,然后添加每个同名对象的数量?
【发布时间】:2018-08-07 04:27:52
【问题描述】:

用户可以创建任意数量的 Thing 实例。用户将字符串输入到带有数字的对象中。

例如创建的对象

Thing thing1 = new Thing("input1", 3);
Thing thing2 = new Thing("input2", 1);
Thing thing3 = new Thing("input2", 3000);
Thing thing4 = new Thing("input1", 4);
Thing thing5 = new Thing("input4", 200");

ArrayList<Thing> ThingList= new ArrayList<Thing>();

ThingList.add(thing1);
.....
.....

我需要让程序搜索 ArrayList of Things 并输出输入的字符串以及具有相同输入字符串的所有整数的总和

输出示例

name    count
input1   7
input2   3001
input4   200

我不确定如何在不加倍输入同名输入的情况下做到这一点。除非我与我输入的名字进行比较

到目前为止我所做的(注意它只能找到并汇总我输入的内容以供搜索。)

  for( i= 0; i< ThingList.size(); i++){

      inputedThingCheck = ThingList.get(i).getInputedName();

   //testInput is the input I know for a fact is inside arraylist
   if(inputedThingCheck.equals(testInput)){

       thingTotal = ThingList.get(i).getCount() + thingTotal;
           }
    }  

我想知道如何让程序搜索每个事物对象,并将所有同名事物的计数加到总数中,同时跳过已经完成的事物

【问题讨论】:

  • 解决此类问题的第一步通常是“使用真正的数据结构,从数据中满足您的需求”。一定要使用具有内部数组列表的类,但给它一个insert(Thing),以便在插入时保持运行计数。这样一来,添加后无事可做,您只需向经理索要计数,它就会立即得到答案。

标签: java sorting arraylist


【解决方案1】:

您可以使用Collectors.groupingBy 尝试类似的操作

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Thing {

    private String key;

    private int value;

    public Thing(String key, int value) {
        super();
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Thing [key=" + key + ", value=" + value + "]";
    }

    public static void main(String[] args) {
        List<Thing> source = Arrays.asList(
                new Thing("input1", 3), 
                new Thing("input2", 1), 
                new Thing("input2", 3000),
                new Thing("input1", 4), 
                new Thing("input4", 200));

        List<Thing> target = source.stream().collect(Collectors.groupingBy(thing -> thing.key)).entrySet().stream()
                .map(e -> e.getValue().stream().reduce((f1, f2) -> new Thing(f1.key, f1.value + f2.value)))
                .map(f -> f.get()).collect(Collectors.toList());

        System.out.println(target);
    }

}

谢谢!

【讨论】:

    【解决方案2】:

    您还可以实现 groupby 功能,例如 java 8

    Map<String, Integer> sum = list.stream().collect(
                    Collectors.groupingBy(Thing::getkey, Collectors.summingInt(Thing::getValue)));
    

    【讨论】:

      【解决方案3】:

      我想与其使用 ArrayList 来包含事物对象,不如将其存储为键值对会更容易。键可以是事物的名称,值可以是包含该特定键计数的数组。

          ArrayList<Thing> foo = new ArrayList<Thing>();
      
          foo.add(thing1);
          foo.add(thing2);
          foo.add(thing3);
          foo.add(thing4);
          foo.add(thing5);
      
          Map<String, ArrayList<Integer>> ThingList = new HashMap<String, ArrayList<Integer>>();
      
          for (Thing x : foo){
              if (ThingList.containsKey(x.getName())){
                  ArrayList value = ThingList.get(x.getName());
                  value.add(x.getValue());
              }
              else{
                  container = new ArrayList<Integer>();
                  container.add(x.getValue());
                  ThingList.put(x.getName(), container);
              }
      
          }
      
          // Debug to check the key, value pair of ThingList
          // System.out.println(Arrays.asList(ThingList));
      
          // Loop through ThingList and get the key + sum of its related values
          for (Map.Entry<String, ArrayList<Integer>> entry : ThingList.entrySet()) {
      
            String key = entry.getKey();
            ArrayList value = entry.getValue();
      
            int valueSum = 0;
            for (int i=0 ; i < value.size() ; i++){
                valueSum += (Integer)value.get(i);
            }
      
          // Print the output 
            System.out.println(key + " " + String.valueOf(valueSum));
          }
      
       }
      

      【讨论】:

        猜你喜欢
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多