我正在寻找一个Comparator
来写一个min
放在stream
集合中,让我们说出来吧#sa List<Node>
。通常我只是将List的对象相互比较,但我的问题是我有一个<Node>
在集合之外,我需要在集合中返回节点的最小值,因为它们与父节点相对应。
我有一个Node
public class Node {
private int cost;
private int location;
public int getCost() { return cost }
}
我使用外部函数将集合中的节点与父节点进行比较:
public int distanceBetween(Node parent, Node child) { ... }
现在我想基本上编写一个流操作,它返回具有最低值的Node,因为它与其父Node
进行比较但不会在该集合中。类似的东西:
private Node returnOpenNodeWithLowestFCost(Node parent) {
return nodeList.stream()
.min( (n1 , n2) -> ???);
.getOrElse(parent);
}
nodeList
不包含parent
,而且是List<Node>
在包含???的区域是我将每个N发送给其父母进行评估的地方。所以,如果打电话
distanceBetween(parent, n1) > distanceBetween(parent, n2)
,会导致返回n1。但我无法正确配置该功能。有任何想法吗?谢谢!
答案 0 :(得分:5)
您可以使用Comparator.comparingInt
制作比较器:
Comparator<Node> byDistFromParent = Comparator.comparingInt(n -> distanceBetween(parent, n));
习惯使用comparingInt
的静态导入,因此流表达式变为:
return nodeList.stream()
.min(comparingInt(n -> distanceBetween(parent, n));
.orElse(parent);
答案 1 :(得分:3)
父节点(未包含在列表中的节点)似乎是已修复。这建立了一个来源,从中测量到列表节点的距离。如果我理解正确,您希望返回最接近该父节点的列表节点。
为此,您需要获取节点n1
和n2
到父节点的距离,并将这些实际距离相互比较。如果n1
离父节点比n2
0
更近,如果n1
和n2
距父母一样远,则应返回负值节点,如果n2
比n1
更接近父节点,则为正值。这是一个具有该逻辑的方法:
private int compareDistances(Node n1, Node n2) {
int distance1 = this.distanceBetween(parent, n1);
int distance2 = this.distanceBetween(parent, n2);
return distance2 - distance1; // negative if n1 closer than n2
}
以下是使用上述方法的比较器:
return nodeList.stream()
.min(this::compareDistances)
.getOrElse(parent);
注意:如果您想要完全相反(要返回父节点最远的节点而不是最接近父节点的节点),则应使用max
而不是min
:
return nodeList.stream()
.max(this::compareDistances)
.getOrElse(parent);