2017-11-27 9 views
0

バイナリ検索ツリーのデータ構造を調べていますが、2つの文字列ノードを比較しようとすると問題が発生します。これは私のコードです.18行目で、ルートノードと別の文字列ノードを比較したいと思います。あるノード型の文字列を別のノード型の文字列と比較するバイナリ検索ツリー

nodeToAdd.word < node.word //this is how i want to compare the nodes 

私は、文字列を比較するとき、あなたが<>を使用カント知っている、あなたはcompareTo()equals()を使用します。ノードを比較するこのような状況では、2つのノードを比較してどのノードがアルファベット順に高いか低いかを調べるにはどうすればよいですか?

public class binarytree implements WordStore { 

    Node root; 

    public void add(String word) { 
     Node nodeToAdd = new Node(word); 

     if (root == null) { 
      // if there's no root, then the node becomes root 

      root = nodeToAdd; 
     } 
     traverseAdd(root, nodeToAdd); 

    } 
    private void traverseAdd(Node node, Node nodeToAdd) { 

     if (nodeToAdd.word < node.word)) { 
      if (node.leftChild == null) { 
       node.leftChild = nodeToAdd; 
      } else { 
       traverseAdd(node.leftChild, nodeToAdd); 
      } 
    //more code not relevant.... 
} 

答えて

1

を:

Comparator<Node> nodeComparer = Comparator.comparing(node -> node.word); 

今あなたが使用できる2つのノードを比較します:

nodeCompare.compare(node1, node2); 

そのクラスtの自然順序付けがない限り、クラスにComparableを実装しないでください。帽子は、ほとんどの状況(ソート、最小、最大などの発見)で合理的です。私はこれがノードに当てはまるとは思わない。私は木の深さで並べ替えたい、または捨て札の数を探したり、最長の文字列やその他の基準を持つノードを見つけたいと思っています。あなたのニーズに合ったカスタムComparatorを使用することをお勧めします。

はまた、あなたがComparableを実装する場合、自然順序が強く等号(Comparableを参照)と一致するように推奨されますので、あなたの可能性が高いだけでなくequalshashCodeを定義する必要があることに注意してください。

ナチュラルオーダーとその使用時期の詳細については、this questionへの回答を参照してください。

0

あなたはクラスNodeComparableを実装することができ、それによって、あなたがアルファベット順に文字列を比較することが可能な方法compareToをオーバーライドする必要があります。

あなたはノードが何かやっによって保持言葉と比較委任することができます:Comparatorを定義する2つのノードを比較するためにreturn this.word.compareTo(Other.word)

+0

これ以外の方法はありませんか、これが最良のコードプラクティスですか? – Timmay696969

+1

@ Timmay696969これはオブジェクト指向の方法です。ノードを比較し、クラスに['Comparable']を実装させたい(https://docs.oracle.com/javase/8/docs/api/java/lang /Comparable.html)。 – alfasin

+1

@ Timmay696969これは標準的な方法であり、Nodeクラスをコレクションフレームワークでソート可能にします。しかし、Nodeに 'greaterThan()'メソッドを定義してこのコンセプトを捕捉することはできますが、そうではありません。 – Bohemian

関連する問題