Java 返回由流外部的对象确定的流上的最小值
我正在寻找一个Java 返回由流外部的对象确定的流上的最小值,java,java-8,java-stream,min,comparator,Java,Java 8,Java Stream,Min,Comparator,我正在寻找一个比较器来编写,将最小值放入集合的流中,就说它是一个列表。通常,我只是将列表中的对象相互比较,但我的问题是我有一个,它在集合之外,我需要返回集合中节点的最小值,因为它们与父节点相对 我有一个Node public class Node { private int cost; private int location; public int getCost() { return cost } } 我将集合中的节点与具有外部函数的父节点进行比较: public int di
比较器
来编写,将最小值
放入集合的流
中,就说它是一个列表
。通常,我只是将列表中的对象相互比较,但我的问题是我有一个
,它在集合之外,我需要返回集合中节点的最小值,因为它们与父节点相对
我有一个Node
public class Node {
private int cost;
private int location;
public int getCost() { return cost }
}
我将集合中的节点与具有外部函数的父节点进行比较:
public int distanceBetween(节点父节点,节点子节点){…}
现在我想基本上编写一个流操作,返回与其父节点相比具有最低值的节点,但不在集合中。比如:
private Node returnOpenNodeWithLowestFCost(Node parent) {
return nodeList.stream()
.min( (n1 , n2) -> ???);
.getOrElse(parent);
}
节点列表
不包含父节点,是一个列表
在包含???的区域中???在这里,我将发送每个N,以对其父对象进行评估。所以,如果打电话
distanceBetween(parent,n1)>distanceBetween(parent,n2)
,它将导致返回n1。但是我不能完全正确地配置函数。有什么想法吗?谢谢大家! 父节点(列表中未包含的节点)似乎是固定的。这将建立一个原点,从该原点测量到列表节点的距离。如果我理解正确,您希望返回列表中距离此父节点最近的节点
为此,需要获得节点n1
和n2
到父节点的距离,并相互比较这些实际距离。如果n1
比n2
更接近父节点,则应返回负值;如果n1
和n2
与父节点的距离相等,则应返回0
;如果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);
您可以使用来制作比较器:
Comparator<Node> byDistFromParent = Comparator.comparingInt(n -> distanceBetween(parent, n));
非常感谢。到目前为止,这两种观点都是正确的,但我选择你的观点是因为你的回答清晰。接下来的问题是,如果我的
nodeList
只包含1项,如果min()
方法希望总是比较nodeList
中至少2个不同的值,会发生什么情况?@NateH06没有问题,您只提供了相互比较两个元素的逻辑,但您的代码实际上不执行任何比较。这里正确地处理了您所指的特殊情况,我认为代码在流实现类中。
return nodeList.stream()
.min(comparingInt(n -> distanceBetween(parent, n));
.orElse(parent);