在Stream之外的对象确定的流上返回min

时间:2017-03-05 18:51:44

标签: java java-8 java-stream min comparator

我正在寻找一个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。但我无法正确配置该功能。有任何想法吗?谢谢!

2 个答案:

答案 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)

父节点(未包含在列表中的节点)似乎是已修复。这建立了一个来源,从中测量到列表节点的距离。如果我理解正确,您希望返回最接近该父节点的列表节点。

为此,您需要获取节点n1n2到父节点的距离,并将这些实际距离相互比较。如果n1离父节点比n2 0更近,如果n1n2距父母一样远,则应返回负值节点,如果n2n1更接近父节点,则为正值。这是一个具有该逻辑的方法:

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