簡體   English   中英

比較Java Comparator中的兩個TreeNode(或DefaultMutableTreeNode)對象

[英]comparing two TreeNode (or DefaultMutableTreeNode) objects in Java Comparator

我的目標今天很簡單,我正在嘗試為擴展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的兩個實例時,該如何比較它們呢!

提前致謝。

我假設您不能為每種類型的數據都有一個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>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM