2017-03-05 3 views
3

Comparatorminの中に入れてコレクションのstreamに入れると、それはList<Node>と言うことにします。通常、私はリストのオブジェクトを互いに比較するだけですが、私の問題はコレクションの外にある<Node>です。コレクション内のノードの最小値を返す必要があります。親ノード私は基本的に書きたいStreamの外側のオブジェクトによって決定されたストリームの分を返す

public int distanceBetween(Node parent, Node child) { ... }

そして今:

私は外の機能を持つ親ノードに対して、コレクション内のノードを比較Node

public class Node { 
    private int cost; 
    private int location; 
    public int getCost() { return cost } 
} 

のオブジェクトを持っていますストリーム操作では、値が最も小さいNodeが返されます。そのノードは親のNodeと比較されますが、その値は設定されません。ような何か:

private Node returnOpenNodeWithLowestFCost(Node parent) { 
     return nodeList.stream() 
        .min((n1 , n2) -> ???); 
        .getOrElse(parent); 
    } 

nodeListparentを含み、そして含む領域でList<Node>

ではありません???親に対して評価するために各Nを送信する場所です。したがって、

distanceBetween(parent, n1) > distanceBetween(parent, n2)を呼び出すと、n1が返されます。しかし、私は機能を正しく設定することはできません。何か案は?ありがとうございました!

答えて

3

親ノード(リストに含まれていないノード)は、と固定されているようです。これにより、リストのノードまでの距離を測定する起点が確立されます。私が正しく理解していれば、この親ノードに最も近いリストのノードを返すことになります。

これを行うには、親ノードにノードn1n2の距離を取得し、これらの実際の距離をお互いに比較する必要があります。 n1n2より親ノードに近い場合n2n1より親ノードに近い場合n1n2両方が均等に遠くの親ノード、および正の値からある場合は0、負の値を返す必要があります。ここではそのロジックを持つメソッドです:

return nodeList.stream() 
    .min(this::compareDistances) 
    .getOrElse(parent); 

注:

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 
} 

そしてここでは、上記の方法を使用してコンパレータのあなたは(まったく逆が親最も遠いノードを返すしたい場合代わりに、親ノード最も近い1)のノードが、あなたはminの代わりにmaxを使用する必要があります。

return nodeList.stream() 
    .max(this::compareDistances) 
    .getOrElse(parent); 
+0

ありがとうございました。どちらも正しいですが、私はあなたの回答を明確にするためにあなたを選びます。 'nodeList'に1つの項目しか含まれていないとどうなりますか?' nodeList'の少なくとも2つの異なる値を常に比較すると 'min()'メソッドに問題がありますか? – NateH06

+1

@ NateH06それでは、2つの要素をお互いに比較するロジックしか提供しませんが、コードは実際には比較を実行しません。あなたが参照している特殊なケースは、そこでは正しく処理されていますが、ストリーム実装クラスにあると考えられるコードによって処理されます。 –

5

あなたはを使用することができます0コンパレータを作るために:あなたは式になっストリーミングよう

Comparator<Node> byDistFromParent = Comparator.comparingInt(n -> distanceBetween(parent, n)); 

comparingIntの静的インポートを使用するのが通例である:

return nodeList.stream() 
      .min(comparingInt(n -> distanceBetween(parent, n)); 
      .orElse(parent); 
関連する問題