【发布时间】:2016-12-09 07:23:09
【问题描述】:
假设我有一个对象列表。我想将它们分组到一个列表列表中,其中每个内部列表都包含布尔比较函数为其返回 true 的元素:
public class VO {
public VO(int age, int val) {
this.age = age;
this.val = val;
}
public int age;
public int val;
}
public void testGrouping() {
// Equal to vo2
VO vo1 = new VO(1, 100);
// Equal to vo1 and vo3
VO vo2 = new VO(3, 105);
// Equal to vo2 but not vo1 (age difference > 2),
// so it belongs into a new bucket
VO vo3 = new VO(5, 110);
// Equal to vo3, so it belongs into the same bucket as vo3
VO vo4 = new VO(7, 116);
List<VO> values = Arrays.asList(vo1, vo2, vo3, vo4);
//Group values using isEqual(VO, VO) into buckets somehow
//Any two values in a bucket must pass the check
//Expected without any specific order:
//[[vo1, vo2, [vo3, vo4]]
}
private boolean isEqual(VO a, VO b) {
return Math.abs(a.age - b.age) <= 2 && Math.abs(a.val - b.val) <= 10;
}
这只是我拥有的数据的一个简化示例,实际上比较方法比这更复杂。重要的是,每个对象必须在其存储桶中与检查相关的其他对象匹配。对象不能按特定值分组/映射。
我已经有了执行此操作的代码,但需要三个级别的 for 循环,并且花了我大约一天的时间来编写。我很好奇这是否可以通过流更轻松地实现。
【问题讨论】:
-
这是一个无法解决的任务,因为标准不能保证产生不同的组。您可以拥有三个元素,
a、b、c,其中a和b之间的距离小到足以属于一个组,b和c相同,而a和c距离不够近。然后呢? -
我目前遍历首先按大小排序的列表。我正在寻找一种“足够好”的方法,因此拥有 [a,b] 和 [c] 与拥有 [a] 和 [b,c] 一样有效。
-
Stream API 不是这样工作的。只要保持你的循环......
标签: java list java-8 java-stream