2016-12-17 60 views
1

我有一個TreeSet其中的元素有兩個屬性(姓名和年齡)的對象。每次我想要搜索具有特定名稱的對象時,我都必須使用增強型for循環或迭代器。無法使用TreeSet中的contains()方法

我不能使用方法來搜索具有特定名稱的對象,因爲這個名字是此對象中「封裝」。

有沒有辦法解決這個問題?那就是利用log(n)時間複雜度的一種方法?

由於在TreeSet中所有元素都按名稱排序,必須有一個方式,我認爲。

什麼,我想實現的一個例子:

public Element search(String name) { 
    // if some TreeSet element's name.equals(name), return the Element 
} 

的一個例子是我希望使用:

public Element search(String name) { 
    for (Element entry : tree) { 
     if (entry.getName().equals(name)) { 
      return entry; 
     } 
    } 

    return null; 
} 
+0

爲什麼這是一個集而不是地圖從名字到凡是? – user2357112

+0

@ user2357112:因爲這是一項任務,我不允許更改集合。 –

+0

然後,分配可能要麼使用O(n)查找,要麼避免執行這些查找操作。還有可能你應該建立和維護一個輔助地圖,或者這個任務不一致,或者你誤解了某些東西。 – user2357112

回答

0

在一般情況下,我們現有的TreeSet<Person>無法使用用於按名稱查找。樹組將根據您爲該組定義的順序進行組織。

一般來說,您需要一個單獨的Map<String, Person>,它保存原始集合中所有Person對象的映射。這需要保持集合和地圖的一步。

但是,如果你的樹設置的順序是姓名和年齡的組合,名爲提供主要排序,那麼你可以使用TreeSet.tailSet得到了一套「尾巴」開始了給定的名稱。然後迭代尾部集合直到名稱更改。

0

TreeSet安排基於其Comparator項目。

您可以實現比較操作由名頭進行排序。