「put」メソッドがオブジェクトに与えた自動インデックスを返すJavaのコレクションはありますか?
4 に答える
すべての java.util.Map クラスには、後でオブジェクトを取得できるキーを提供できるput(K key, V value)
メソッドが含まれています。
HashMap
独自の拡張子でラップできます。そこから要素を安全に削除でき、残りの要素はインデックスを保持します。
class MyHashMap<T> {
int index = 0;
HashMap<Integer, T> internalMap = new HashMap<>();
public int add(T t) {
int temp = index++;
internalMap.put(temp, t);
return temp;
}
}
スレッドセーフにする必要がある場合は、AtomicInteger
forindex
とConcurrentHashMap
forを使用しinternalMap
ます。
使用しているコレクションによって異なります。ほとんどのコレクションは、要素がコレクションに追加されたかどうかを示すブール値を返します。しかし、特定の順序ではないコレクションが多数あるため (コレクションの作業中にその順序が変わる可能性があるため)、インデックスは正しくなくなります。
インデックスを取得する方法の例:
// ArrayList, LinkedList (they put the new element at the end of the list)
list.add(myElement);
int index=list.size()-1;
// LinkedList , Stack... (with "push" the new element will be put at the beginning of the list)
list.push(myElement);
int index = 0;
コレクションにインデックス (マップではない) がある場合は、呼び出してそのインデックスを取得できます。
int index = myCollection.indexOf(myElement);
編集を追加するのを忘れていましたが、これには をオーバーライドして等価テストを実装する必要がありますequals(Object o)
。(ありがとうムハンマド・ゲルバナ) /edit
これは、コレクションが変更された場合でも、インデックスが正しいものであることを確認する最も安全な方法です。
しかしもちろん、インデックスを取得する方法を確認するには、さまざまな目的を持つさまざまなコレクションが多すぎます。たとえば、マップには通常、インデックスはありませんが、自分で提供する必要がある「キー」があります。
もちろん、独自のコレクションを作成して、常に正しいインデックスを持つようにすることもできます。map
すでに提案されているようにa を実装するか、配列を使用します。
public class MyCollection{
private E[] array;
public MyCollection<E>(){
array = new E[0];
}
public int put(E element){
// create a new array that can hold one more element
E[] copy = new E[array.length+1];
// copy the old array into a new array
int i=0;
for(;i<array.length;i++){
copy[i] = array[i];
}
copy[i]=element;
return i;
}
}
要素を追加 (つまり) した後はいつでも a を呼び出すことができますsize()
。要素のインデックスを取得するには、戻り値を 1 減らす必要があります。List
add(element)