сравнение двух объектов TreeNode (или DefaultMutableTreeNode) в компараторе Java - PullRequest
0 голосов
/ 07 октября 2010

Моя цель сегодня очень проста, я пытаюсь найти правильный способ реализации интерфейса CompareTo (или Comparable) для моего класса, который расширяет DefaultMutableTreeNode.

Проблема заключается в следующем : Скажем, у меня есть очень хороший класс, который представляет времена.Я уже написал очень хороший метод 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());
    }
}

Хорошо, так что, если вы не читали комментарии (что, допустим, вы не читали);Моя проблема в том, что в методе сравнения SpecialTode у меня есть доступ только к userObject.К сожалению, я не знаю, каким был userObject, и поэтому я не могу правильно привести его к вызову правильного метода compareTo!

Это действительно боль, поскольку я уже написал несколько совершенно хорошихСравнить методы во всех классах, которые будут добавлены в мое дерево.Так может ли кто-нибудь помочь парню и дать мне подсказку?

tl; dr - Как получить информацию о типе из универсального объекта, который хранит DefaultMutableTreeNode?Если это невозможно, как мне сравнить два экземпляра SpecialNode, когда я даже не знаю, что они могут содержать!

Заранее спасибо.

1 Ответ

1 голос
/ 07 октября 2010

Я предполагаю, что вы не можете иметь TreeNode для каждого типа данных.Имеет ли смысл в вашем случае делать сравнения, если тип отличается?

Идеи:

  1. Может ли SimpleNode знать все возможные типы и делать instanceof и приведение типовправильный тип для сопоставимых?Так бы я поступил несколько лет назад.

  2. Как вы относитесь к непроверенным предупреждениям?У меня была похожая проблема до использования JList, и я не мог порадовать компилятор (я отказался от модели по умолчанию, чтобы облегчить мою жизнь).Может быть, кто-то еще мог бы улучшить этот ответ?

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

...