web-dev-qa-db-ja.com

Java.util.Setでアイテムのインデックスを取得する方法

SetとListの違いを知っています(一意と、重複は許可されていますが、順序付け/順序付けはされていません)。私が探しているのは、要素の順序を保持するセットです(簡単です)が、要素が挿入されたインデックスを回復できる必要もあります。したがって、4つの要素を挿入すると、そのうちの1つが挿入された順序を知ることができます。

MySet<String> set = MySet<String>();
set.add("one");
set.add("two");
set.add("three");
set.add("four");

int index = set.getIndex("two");

そのため、任意の時点で、文字列が既に追加されているかどうかを確認し、セット内の文字列のインデックスを取得できます。このようなものはありますか、それとも自分で実装する必要がありますか?

29

Utilクラスの小さな静的カスタムメソッドが役立ちます。

_ public static int getIndex(Set<? extends Object> set, Object value) {
   int result = 0;
   for (Object entry:set) {
     if (entry.equals(value)) return result;
     result++;
   }
   return -1;
 }
_

is aSetであり、getIndex()メソッドを提供するクラスが必要な場合は、新しいSetを実装して使用することを強くお勧めします。デコレータパターン:

_ public class IndexAwareSet<T> implements Set {
   private Set<T> set;
   public IndexAwareSet(Set<T> set) {
     this.set = set;
   }

   // ... implement all methods from Set and delegate to the internal Set

   public int getIndex(T entry) {
     int result = 0;
     for (T entry:set) {
       if (entry.equals(value)) return result;
       result++;
     }
     return -1;
   }
 }
_
13
Andreas_D

Setを作成したら、それをリストに変換し、リストからインデックスで取得します。

Set<String> stringsSet = new HashSet<>();
stringsSet.add("string1");
stringsSet.add("string2");

List<String> stringsList = new ArrayList<>(stringsSet);
stringsList.get(0); // "string1";
stringsList.get(1); // "string2";
25
Kiryl Ivanou

LinkedHashSet 目的のgetIndex()メソッドを追加することができます。実装してテストするのに15分かかります。イテレータとカウンタを使用してセットを調べ、オブジェクトが等しいかどうかを確認してください。見つかった場合は、カウンターを返します。

3
Vladimir Ivanov

値がインデックスであるハッシュテーブルに文字列を追加する方法は次のとおりです。

  Hashtable<String, Integer> itemIndex = new Hashtable<>();
  itemIndex.put("First String",1);
  itemIndex.put("Second String",2);
  itemIndex.put("Third String",3);

  int indexOfThirdString = itemIndex.get("Third String");
0
abinkleysf