使用 Java 流来查找集合中最接近的对
Using Java streams to find the closest pair in a set
我有一组元素,它们之间有一个距离度量。我正在寻找一种方法来从该集合中找到最接近的一对元素。使用循环我会使用以下算法:
double minDistance = Double.MAX_VALUE;
AbstractMap.SimpleEntry<Element, Element> closestPair;
for (Element element1 : elements) {
for (Element element2 : elements) {
double currentDistance = element1.distance(element2);
if (!element1.equals(element2) && currentDistance < minDistance) {
minDistance = currentDistance;
closestPair = new AbstractMap.SimpleEntry(element1, element2);
}
}
}
是否有使用 Java 流来实现此算法的优雅方法?
可能是这样的:
Optional<SimpleEntry> closestPair = elements.stream()
.flatMap(elem -> elements.stream()
.filter(other -> !elem.equals(other))
.map(other -> new SimpleEntry(elem, other))
.min(Comparator.comparingDouble(e -> e.getKey().distance(e.getValue()));
但您可能希望将这些内联 lambda 提取为单独的方法。
我有一组元素,它们之间有一个距离度量。我正在寻找一种方法来从该集合中找到最接近的一对元素。使用循环我会使用以下算法:
double minDistance = Double.MAX_VALUE;
AbstractMap.SimpleEntry<Element, Element> closestPair;
for (Element element1 : elements) {
for (Element element2 : elements) {
double currentDistance = element1.distance(element2);
if (!element1.equals(element2) && currentDistance < minDistance) {
minDistance = currentDistance;
closestPair = new AbstractMap.SimpleEntry(element1, element2);
}
}
}
是否有使用 Java 流来实现此算法的优雅方法?
可能是这样的:
Optional<SimpleEntry> closestPair = elements.stream()
.flatMap(elem -> elements.stream()
.filter(other -> !elem.equals(other))
.map(other -> new SimpleEntry(elem, other))
.min(Comparator.comparingDouble(e -> e.getKey().distance(e.getValue()));
但您可能希望将这些内联 lambda 提取为单独的方法。