快速提问。假设我有一个函数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));
}
}
答案 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;
}