【发布时间】:2016-09-04 19:15:49
【问题描述】:
我有一个项目列表(!):
- 一个
- B
- C
- D
- E
- ...
我想将它们分组:
- [A、C、D]
- [B, E]
- ...
组由以下人员定义:
- 根据自定义函数 f(a, b) -> boolean,组中的所有项目都相等
- f(a, b) = f(b, a)
问题:是否有现成的 API 可以这样做?
<T> List<List<T>> group(Collection<T> collection, BiFunction<T, T, Boolean> eqF);
更新。这个问题完全不适用于您可以定义一些质量作为分组依据的场景!在这种情况下,Java 8 Collectors.groupingBy 是最简单的答案。
我正在使用多维向量,等式函数看起来像:
- 指标(a,b)
在这种情况下,定义哈希等于解决初始任务:)
【问题讨论】:
-
如果用于对元素进行分组的自定义函数返回布尔值,你怎么能拥有超过 2 个组?
-
@Tunaki - 这称为划分为等价类。假设对象是整数并且相等(真/假)是模 3 计算的(即,如果它们具有相同的余数,则它们相等)。然后从 1 到 100 的整数将最终分到三个桶中,即使这是一个二元相等性测试。
-
例如有一个 F 元素,它不等于任何其他元素。它由一个元素组成一组。
-
回应你的更新:你确定你这里有等价关系吗?通常,
metrics(a,b) < threshold是不可传递的,除非您的空间具有满足某些异常约束的结构。 -
如果测试甚至不是对称的,那么您就没有度量标准。分组项目 (1) 与您真正想要完成的事情以及 (2) 甚至在理论上可能如何相关?听起来您正在寻求与您的潜在问题实际上无关的问题 Y 的解决方案。您可能想要删除此问题并发布一个描述您实际追求的问题的其他问题。