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");
そのため、任意の時点で、文字列が既に追加されているかどうかを確認し、セット内の文字列のインデックスを取得できます。このようなものはありますか、それとも自分で実装する必要がありますか?
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;
}
}
_
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";
LinkedHashSet
目的のgetIndex()
メソッドを追加することができます。実装してテストするのに15分かかります。イテレータとカウンタを使用してセットを調べ、オブジェクトが等しいかどうかを確認してください。見つかった場合は、カウンターを返します。
値がインデックスであるハッシュテーブルに文字列を追加する方法は次のとおりです。
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");