1

順序付けられた、一意のオブジェクトのセットがあります。私は現在、正しい順序を取得するためにTreeSetを使用しています。ただし、セットにはインデックスを取得する機能がありません。

私の現在の実装は問題ありませんが、必ずしも直感的ではありません。

TreeSet<T> treeSet = new TreeSet<T>(Comparable c);
// Omitted: Add items to treeSet //
int index = new ArrayList<T>(treeSet)().indexOf(object);

これを行う簡単な方法はありますか?

4

3 に答える 3

1

また、TreeMapの特定の位置で要素を見つけるという問題に直面しました。インデックスによって要素にアクセスし、インデックスで要素を見つけることができる重みでツリーを拡張しました。このプロジェクトは、indexed-tree-maphttps://github.com/geniot/indexed-tree-mapと呼ばれます。ソートされたマップのインデックスで要素または要素のインデックスを検索するための実装は、線形反復ではなく、ツリーの二分探索に基づいています。ツリーの重みの更新も、ツリーをルートに登ることに基づいています。したがって、線形反復はありません。

于 2013-02-10T17:17:14.813 に答える
1

treeSet.headSet(object).size()トリックを行う必要があります:

import java.util.SortedSet;
import java.util.TreeSet;

class Test {

  public static void main(String[] args) {

    SortedSet<String> treeSet = new TreeSet<String>();
    String first = "index 0";
    String second = "index 1";
    treeSet.add(first);
    treeSet.add(second);

    int one = treeSet.headSet(second).size();

    System.out.println(one);
    // 1
  }
}
于 2012-06-18T22:32:04.167 に答える
0

Javaにはそのようなものはありません。ここにあなたができることのいくつかの提案があります:

  1. これはそれほど悪くないので、そのままにしておきます;)
  2. イテレータを使用して要素を調べます
  3. TreeSetを拡張し、get機能を追加するラッパークラスを記述します。
  4. グアバをチェックアウトして、このようなものがあるかどうかを確認してください(私はそれを使用していないので、わかりません、申し訳ありません!)
  5. 配列Object[] arrayView = mySet.toArray();を作成し、そこから要素を取得します(これは、パフォーマンスとメモリの点でちょっとばかげています)
于 2012-06-18T22:18:59.853 に答える