我对Java中的LinkedList类有疑问。 我有一个场景,我需要根据索引是否存在于链表中来添加或设置索引。我想要实现的伪代码是 -
if index a exists within the linkedlist ll
ll.set(a,"arbit")
else
ll.add(a,"arbit")
我确实浏览了LinkedList类的Javadocs,但没有遇到任何相关内容。
有什么想法吗?
由于 p1ng
答案 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<Integer,String>
创建数据集,然后使用HashMap<?,?>.getKeySet()
提取密钥,然后按自然顺序对它们进行排序(它们是数字毕竟)然后在迭代keySet时从地图中提取值。讨厌,但做你想要的......或者创建你自己的OrderedMap类,它做同样的事情......
你能否扩展一下你为什么需要使用LinkedList?结果的排序是否重要?