【问题标题】:comparing two TreeNode (or DefaultMutableTreeNode) objects in Java Comparator在 Java Comparator 中比较两个 TreeNode(或 DefaultMutableTreeNode)对象
【发布时间】:2010-10-07 13:56:53
【问题描述】:

我今天的目标很简单,我正在尝试为扩展 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());
    }
}

好吧,如果你没有读过 cmets(承认你没有读过);我的问题是在 SpecialNode 的 compareTo 方法中,我只能访问 userObject。可悲的是,我不知道 userObject 曾经是什么,因此,我无法正确地将其转换为调用正确的 compareTo 方法!

这真的很痛苦,因为我已经在所有要添加到我的树的类中编写了几个非常好的 compareTo 方法。那么有人可以帮助一个人并给我一个提示吗?

tl;dr - 如何从 DefaultMutableTreeNode 存储的通用对象中获取类型信息?如果这不可能,当我什至不知道它们可能包含什么时,我应该如何比较 SpecialNode 的两个实例!

提前致谢。

【问题讨论】:

    标签: java jtree comparator treenode compareto


    【解决方案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&lt;SpecialNode&lt;T&gt;&gt;

    【讨论】:

    • 感谢您的及时回复!这是一个很好的答案,但它让我嘴里的味道不好。我可以用我的模型合理地假设,每当比较两个 SpecialNodes 时,它们的 userObjects 将属于同一类型。 (换句话说,我可能会在你的'return -1'行抛出一个异常。)但理想情况下,如果可能的话,我真的很想避免基于类型进行切换。至少在我的经验中,这种类型的编程永远不会产生可维护的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2012-12-12
    • 2012-09-07
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多