2

Java中是否有一个集合,它的“put”方法返回它给对象的自动索引,所以你可以及时检索/删除它?

4

4 回答 4

4

所有的 java.util.Map 类都包含一个put(K key, V value)方法,该方法允许您提供一个密钥,您以后可以通过该密钥检索对象。

于 2013-04-17T20:30:58.567 回答
3

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;
    }
}

如果您需要它是线程安全的,请使用AtomicIntegerforindexConcurrentHashMapfor internalMap

于 2013-04-17T20:32:29.687 回答
2

在向其添加(即)元素后,您始终可以调用size()a 。您仍然必须将返回的值减 1 才能获得元素的索引。Listadd(element)

于 2013-04-17T20:32:51.967 回答
2

取决于您使用的集合。大多数集合会给你一个布尔值作为回报,告诉你元素是否被添加到集合中。但是由于有许多集合没有任何特定的顺序(并且在处理集合时该顺序可能会改变),因此索引将不再正确。

一些如何检索索引的示例:

// 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)。(谢谢穆罕默德 Gelbana)/编辑

这实际上是确保索引正确的最安全方法,即使在集合发生更改时也是如此。

但是当然有太多不同的集合具有不同的目标,以确定如何检索索引。例如,地图通常没有索引,而是您必须自己提供的“键”。

您当然可以创建自己的集合并确保始终拥有正确的索引。要么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;
   }
}
于 2013-04-17T20:37:08.647 回答