0

今日の私の目標は非常に単純です。DefaultMutableTreeNode を拡張するクラスに compareTo (または Comparable) インターフェイスを実装する適切な方法を見つけようとしています。

問題は次のとおりです。時間を表す完全に優れたクラスがあるとします。Arrays.sort() でテストした完全に優れた compareTo メソッド (希望どおりに動作する) を既に作成しており、すばらしい結果が得られています。

ここで、次のように、さまざまなオブジェクトの束を持つ JTree があるとします。

    new SpecialNode("Zomg a string!"); // add this group of nodes right here
    new SpecialNode(new Time("8:55 PM"));
    new SpecialNode(new SomeTypeYouveNeverHeardOf());

だから、プロのプログラマーとして、何も考えずにすぐにコーディングを開始します。ここに私の SpecialNode クラスがあります:

class SpecialNode extends DefaultMutableTreeNode implements Comparator<SpecialNode>
{
    public int compareTo(SpecialNode sn)
    {
        // Not only does this not work correctly (read: at all)
        // But, it is sub-par, how do I get the type information out of the userObject
        // So I can cast it correctly and call the correct compareTo method!!
        return this.getUserObject().toString().compareTo(sn.getUserObject().toString());
    }
}

わかりましたので、もしあなたがコメントを読まなかったなら (それは認めますが、あなたは読んでいませんでした); 私の問題は、SpecialNode の compareTo メソッド内で、userObject にしかアクセスできないことです。悲しいことに、私は userObject が何だったのかわかりません。そのため、適切にキャストして正しい compareTo メソッドを呼び出すことができません!

ツリーに追加されるすべてのクラスで、いくつかの完全に優れたcompareToメソッドをすでに作成しているため、これは本当に面倒です。それで、誰かが男を助けて、私にヒントをドロップできますか?

tl;dr - DefaultMutableTreeNode が格納する汎用オブジェクトから型情報を取得するにはどうすればよいですか? それが不可能な場合、SpecialNode の 2 つのインスタンスが何を含んでいるのかさえわからないのに、それらを比較するにはどうすればよいでしょうか!

前もって感謝します。

4

1 に答える 1

1

データの種類ごとに TreeNode を持つことはできないと思います。タイプが異なる場合、ユースケースで比較を行うことは理にかなっていますか?

アイデア:

  1. SimpleNode は考えられる型をすべて認識し、instanceof を実行して Comparable の正しい型にキャストできますか? これは、私が数年前にそれを処理したであろう方法です。

  2. チェックされていない警告についてどう思いますか? JList を使用する前にも同様の問題があり、コンパイラーを満足させることができませんでした (生活を楽にするために、swing のデフォルト・モデルをあきらめました)。他の誰かがこの答えを改善できるでしょうか?

    class SpecialNode<T extends Comparable<T>> extends DefaultMutableTreeNode 
                                              implements Comparable<SpecialNode>
    {
      T typedUserObject;
      SpecialNode(T t)
      {
         this.typedUserObject = t;
         setUserObject(t);
      }
    
    
      public int compareTo(SpecialNode node)
      {
          if(typedUserObject.getClass().isInstance(node.typedUserObject))
          {
              T otherObj = (T) node.typedUserObject;
              return typedUserObject.compareTo(otherObj);
          }
          else
          {
              //What are you going to do if they're not the same type?
              return -1;
          }
      }
    
    
    }
    

編集: それらが同じタイプであることがわかっている場合-チェックを排除します

class SpecialNode<T extends Comparable<T>> extends DefaultMutableTreeNode
                                          implements Comparable<SpecialNode<T>>
{
  T typedUserObject;
  SpecialNode(T t)
  {
     this.typedUserObject = t;
     setUserObject(t);
  }


  public int compareTo(SpecialNode<T> node)
  {
     return typedUserObject.compareTo(node.typedUserObject);
  }    
}

ノード自体にコードを入れたくない場合 (そうは思わない)、別のクラスを作成して、implements Comparator<SpecialNode<T>>

于 2010-10-07T14:45:32.953 に答える