0

今天我的目标非常简单,我正在尝试为扩展 DefaultMutableTreeNode 的类找到实现 compareTo(或 Comparable)接口的正确方法。

问题是这样的:假设我有一个非常好的代表时代的课程。我已经编写了一个非常好的 compareTo 方法(它可以按我的意愿工作),我已经用 Arrays.sort() 进行了测试,结果非常好。

现在假设我有一个带有一堆不同对象的 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 的两个实例!

提前致谢。

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 回答