Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回由流外部的对象确定的流上的最小值_Java_Java 8_Java Stream_Min_Comparator - Fatal编程技术网

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);