关于Java的LinkedList类的问题

时间:2011-01-14 14:24:56

标签: java linked-list

我对Java中的LinkedList类有疑问。 我有一个场景,我需要根据索引是否存在于链表中来添加或设置索引。我想要实现的伪代码是 -

if index a exists within the linkedlist ll 
     ll.set(a,"arbit")
else
      ll.add(a,"arbit")

我确实浏览了LinkedList类的Javadocs,但没有遇到任何相关内容。

有什么想法吗?

由于 p1ng

6 个答案:

答案 0 :(得分:3)

如何使用Map

Map<Integer, String> map = new HashMap<Integer, String>();

// ...

int a = 5;

map.put(a, "arbit");

即使a已经存在,put也只会替换旧字符串。

答案 1 :(得分:2)

在链表中搜索效率不高(O(n))。您是否考虑过使用不同的数据结构 - 例如HashMap会给你O(1)访问时间吗?

答案 2 :(得分:2)

如果您需要顺序访问以及键控访问,您可能需要尝试使用LinkedHashMap,可从1.4.2开始使用 http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedHashMap.html

答案 3 :(得分:1)

Map<Integer, String> 绝对是一种好的(最好的?)方式。

如果由于某些奇怪的原因需要,可以选择与LinkedList保持一致。它具有可怕的运行时性能并且不允许为null,因为null现在成为索引未被占用的指示符。

String toInsert = "arbit";
int a = 5;

//grow the list to allow index a
while ( a >= ll.size() ) {
   ll.add(null);
}

//set index a to the new value
ll.set(a, toInsert);

如果你要走这条道路,那么ArrayList可能会更好。

为什么这么糟糕?假设您只有一个索引为100,000的元素。此实现需要列表中的100,000个条目指向null。这会导致可怕的运行时性能和内存使用。

答案 4 :(得分:0)

LinkedList里面没有洞,所以你不能有列表[1,2,3,4]然后ll.add(10,10),所以我觉得你的例子有问题。使用Map或搜索其他稀疏数组

答案 5 :(得分:0)

看起来您正在尝试使用a作为键,并且不会说明您是否在索引i < a处拥有项目。如果您在ll.size() <= a时运行代码,那么最终会得到NullPointerException

如果您在索引a处添加项目,则a上的上一项目现在为a+1。 在这种情况下,最好先在a删除项目(如果存在),然后将项目"arbit"添加到a。当然,上面的条件:ll.size() <=a仍然适用于此。

如果结果的顺序很重要,不同的方法可以使用HashMap&lt;Integer,String&gt;创建数据集,然后使用HashMap&lt;?,?&gt;.getKeySet()提取密钥,然后按自然顺序对它们进行排序(它们是数字毕竟)然后在迭代keySet时从地图中提取值。讨厌,但做你想要的......或者创建你自己的OrderedMap类,它做同样的事情......

你能否扩展一下你为什么需要使用LinkedList?结果的排序是否重要?