2016-12-17 5 views
1

要素が2つの属性(名前と年齢)を持つ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

なぜ名前からwhaterversへのマップではなく、Setですか? – user2357112

+0

@ user2357112:これは割り当てなので、コレクションを変更できません。 –

+0

次に、O(n)ルックアップを使用するか、これらのルックアップ操作の実行を避けることが期待されます。また、補助地図を作成して維持する必要があるか、割り当てが矛盾している、または誤解している可能性があります。 – user2357112

答えて

0

、当社の既存TreeSet<Person>は使用できません。名前でルックアップします。ツリーセットは、セットに対して定義した順序に基づいて編成されます。

通常、元のセット内のPersonオブジェクトすべてのマッピングを保持する別のMap<String, Person>が必要です。これは、セットと地図をステップ内に保持することを伴う。あなたのツリーセットの順序は主要順序を提供した名前の名前と年齢の組み合わせがあった場合

しかし、あなたはから始まる一連の「尾」を取得するためにTreeSet.tailSetを使用することができます名。その後、名前が変わるまでテールセットを反復処理します。

0

TreeSetは、そのComparatorに基づいてアイテムを配置します。

比較演算を実装して、名前でソートすることができます。

関連する問題