- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个按月-年字符串属性排序的对象列表。我的对象类定义看起来像
Public class Obj{
String year;
Long membercount;
Long nonmembercount;
Double memberpayment;
Double nonmemberpayment;
}
new Obj("9-2015",100,20,10,5)
new Obj("10-2015",220,40,20,55)
new Obj("11-2015",300,60,30,45)
new Obj("12-2015",330,30,50,6)
new Obj("1-2016",100,10,10,4)
我想对 membercount
、nonmembercount
、memberpayment
、nonmemberpayment
进行累计
所以我的新对象列表如下所示
new Obj("9-2015",100,20,10,5)
new Obj("10-2015",320,60,30,60)
new Obj("11-2015",620,120,60,105)
new Obj("12-2015",950,150,110,111)
new Obj("1-2016",1050,160,120,115)
我尝试使用 Collectors.summingDouble
但它给了我所有的总和,而不是累积的。
非常感谢任何指点。
最佳答案
在 Stream API 中没有对累积操作的直接支持,尽管可以通过自定义 Collector
实现这样的操作。但值得注意的是,已经直接支持对数组进行此类操作,这可能足以满足您的情况:
将 Obj
的草图扩展到
public class Obj {
String year;
Long membercount;
Long nonmembercount;
Double memberpayment;
Double nonmemberpayment;
public Obj(String year, long membercount, long nonmembercount,
double memberpayment, double nonmemberpayment) {
this.year = year;
this.membercount = membercount;
this.nonmembercount = nonmembercount;
this.memberpayment = memberpayment;
this.nonmemberpayment = nonmemberpayment;
}
@Override
public String toString() {
return "Obj("+year+", "+membercount+", "+nonmembercount
+", "+memberpayment+", "+nonmemberpayment+')';
}
}
解决方案可能如下所示:
// test data
List<Obj> list=Arrays.asList(
new Obj("9-2015", 100, 20, 10, 5),
new Obj("10-2015", 220, 40, 20, 55),
new Obj("11-2015", 300, 60, 30, 45),
new Obj("12-2015", 330, 30, 50, 6),
new Obj("1-2016", 100, 10, 10, 4));
// creating an array as need for the operation, it will contain the
// result afterwards, whereas the source list is not modified
Obj[] array = list.toArray(new Obj[0]);
// the actual operation
Arrays.parallelPrefix(array, (a,b) -> new Obj(b.year,
a.membercount + b.membercount,
a.nonmembercount + b.nonmembercount,
a.memberpayment + b.memberpayment,
a.nonmemberpayment + b.nonmemberpayment
));
// just print the result
Arrays.asList(array).forEach(System.out::println);
打印最后一行
Obj(9-2015, 100, 20, 10.0, 5.0)
Obj(10-2015, 320, 60, 30.0, 60.0)
Obj(11-2015, 620, 120, 60.0, 105.0)
Obj(12-2015, 950, 150, 110.0, 111.0)
Obj(1-2016, 1050, 160, 120.0, 115.0)
虽然此操作不太可能受益于对少量元素的并行处理,但遗憾的是没有此操作的顺序版本。所以你可能会考虑使用普通的循环解决方案......
为了完整起见,这里有一个基于流收集器的累积操作解决方案。与 Arrays.parallelPrefix
一样,更新函数必须无副作用且具有关联性,返回具有汇总属性的新对象的函数就是这种情况。
public static <T> Collector<T,?,List<T>> cumulative(BinaryOperator<T> update) {
return Collector.of(ArrayList::new,
(l,o) -> {
if(!l.isEmpty()) o=update.apply(l.get(l.size()-1), o);
l.add(o);
},
(l,m) -> {
if(l.isEmpty()) return m;
if(!m.isEmpty()) {
T a = l.get(l.size()-1);
for(T b: m) l.add(update.apply(a, b));
}
return l;
});
}
按照上面的设置使用它:
List<Obj> result = list.stream().collect(cumulative((a,b) -> new Obj(b.year,
a.membercount + b.membercount,
a.nonmembercount + b.nonmembercount,
a.memberpayment + b.memberpayment,
a.nonmemberpayment + b.nonmemberpayment
)));
关于java - Cumulative Sum 多个对象属性 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130908/
我想像以前使用 Tableau 软件一样使用功率查询进行运行总计。有没有人有想法,提前致谢! 最佳答案 为迟到的答案道歉 - 这个挑战已经困扰了我好几个月了。 论坛和博客上很少有解决方案,但它们似乎都
我有数据 dat <- data.frame(t=1:100,y=rnorm(100),x1=rnorm(100)),x2=rnorm(100)) 其中 t 给出时间点。我想根据前面的时间点在每个时
是否有内置的 pandas 方法来查找两个 pandas 系列之间的累积相关性? 它应该做的是有效地修复 pandas.rolling_corr(data, window) 中窗口的左侧,以便窗口的宽
我有一个连接到 Google Data Studio 的 MySQL 数据库,其中包含“日期”和“新用户”列。 “新用户”列显示每天的新用户数。 我想绘制一张相对于日期的累计用户数的图表。这在电子表格
假设我有一个Java IntStream,是否可以将其转换为具有累积和的IntStream?例如,以 [4, 2, 6, ...] 开头的流应转换为 [4, 6, 12, ...]。 更一般地说,应该
我有一个这样的数组: [30, 10, 4, 3, 3] 我需要将其转换为一个 cumulative% 数组,每个值都是到那里的所有值的总和除以数组中所有值的总和。 在本例中,总数为 50。因此,第一
假设我有一个 Java IntStream,是否可以将其转换为具有累积和的 IntStream?例如,以 [4, 2, 6, ...] 开头的流应转换为 [4, 6, 12, ...]。 更一般地说,
我有一个数据框如下。按time列排序。 输入 - df = data.frame(time = 1:20, grp = sort(rep(1:5,4)),
我是 R 的新手。我不确定如何在 R 中执行以下功能。我可以在 excel 中执行此操作。但无法在 R 中完成。有人可以帮助我吗? 我想得到计数器值达到64后的累加和, 以下是我的数据, x 57 5
我的目标是按日期累计注册用户数 这是我的mysql sql SELECT MONTH( DATE ) AS `month`, COUNT(userid) FROM `stats` WHERE `u
我有一个按月-年字符串属性排序的对象列表。我的对象类定义看起来像 Public class Obj{ String year; Long membercount; Long n
我有一个像这样的向量 v <- c(76, 31, 33, 7) 并且需要计算其导致的“累积差” cumdiff <- c(45, 12, 5) 这是 76 - 31 = 45 和 45 - 33 =
假设我有一个奖项的 SQL 表,其中包含日期和金额字段。我需要生成一个表格,其中包含一系列连续日期、每天奖励的金额以及运行(累计)总数。 Date Amount_Total Amo
我们有如下数据框: +------+--------------------+ | Flag | value| +------+--------------------+
我正在计算“第一”位置总计列(下表)的值,并希望使用多个条件来执行此操作。 我希望总“第一”位置能够反射(reflect)特定运动员赢得比赛的次数(截至特定日期)。 例如...见下文,当运动员 = S
我正在计算“第一”位置总计列(下表)的值,并希望使用多个条件来执行此操作。 我希望总“第一”位置能够反射(reflect)特定运动员赢得比赛的次数(截至特定日期)。 例如...见下文,当运动员 = S
我有像这样的一系列累积值: 1821, 2015-01-26 22:14:42+02:00, 24574.7 1822, 2015-01-26 22:15:05+02:00, 24574.7 1823
我试图在二叉索引树 (BIT) 中找到具有给定累积频率的索引。 我能够在 O(log(n)*log(n)) 中解决这个问题,方法是借助二分搜索和计算任何索引处的累积频率的函数来实现它。 但我想在 O(
我是 Python Pandas 的新手,因此无法找到与许多普通 SQL 操作等效的句法。给定玩具场景: id rank ts alive 1 1 201
我想提高我的谷歌页面速度结果。我发现我的主要问题之一是 Cumulative Layout Shift。我意识到这个问题是由 cookie 和促销弹出窗口引起的。 您有任何解决此 google 页面速
我是一名优秀的程序员,十分优秀!