有没有办法比较List中的两个对象并组合它们最优的值?(Java)

时间:2015-11-12 22:28:20

标签: java compare

快速提问。假设我有一个函数total(List list),我有一个MyObject类,它有一个String和一个int显示在下面,我想在我的total方法中比较两个不同的对象字符串。如果它们相同,则在两者上添加值。否则,什么也不做。

例如数据是 {[约翰娜,200],[杰克,205],[约翰娜,100],[杰克,50]};

输出应该是这样的 {[Johanna,300],[Jack,255]};

public static class MyObject {
   int value;
   String name;
   public MyObject(String nm, int val)
   {
       name = nm;
       value = val;
   }
}

public void total(List<MyObject> list) {
    List<MyObject> newList = new ArrayList<MyObject>();
    Collections.sort(list);
    Iterator<Order> ItrL = list.iterator();
    int index = 0;

    while(ItrL.hasNext())
    {

        MyObject compare = ItrL.next();
        Iterator<MyObject> ItrR = list.listIterator(index);
        index++;

        while (cmp.name.equals(ItrR.next().name)))
            newList.add(new MyObject(cmp.name, cmp.value + ItrR.value));
    }
}

3 个答案:

答案 0 :(得分:2)

您可以并行进行求和和比较,无需先使用流进行排序。

List<MyObject> newList = Arrays.asList(
      new MyObject("Johanna", 200), 
        new MyObject("Jack", 205), 
        new MyObject("Johanna", 100),
        new MyObject("Jack", 50)
);
Map<String,Integer> map =
        newList.stream().parallel()
        .collect(Collectors.groupingBy(mo -> mo.name, 
                Collectors.summingInt(mo -> mo.value)));
System.out.println("map = " + map);

答案 1 :(得分:1)

您可以使用

n^2减少到n*(n/2)
for(int i = 0 ...
   for(int j = i + 1 ...

答案 2 :(得分:1)

没有“最优”的方法,因为它取决于数据的大小。这个问题似乎适合map-reduce,但如果你只喜欢4个元素,那么开销成本并不能证明真正的地图缩减算法。

所以无论如何,这是Java 8之前的一个替代方案(列表不需要先排序):

public static Map<String, Integer> total(List<MyObject> list) {
    Map<String, Integer> result = new HashMap<String, Integer>();

    for (MyObject myObject : list) {
        Integer prevValue = result.get(myObject.name);
        if (prevValue == null) {
            result.put(myObject.name, myObject.value);
        } else {
            result.put(myObject.name, myObject.value + prevValue);
        }
    }

    return result;
}