2012-02-01 82 views
0

我有一个List<Pair<String, String>>我想从Collection复制数据。获取集合元素的最快方法是什么?

什么是读取收藏并将其添加到列表的最佳方式?

List<Pair<String, String>> identityMemoPairs = new LinkedList<Pair<String, String>>(); 
Collection result = handler.getResult(); 

    while(result.iterator().hasNext()){ 
     IdentityM im =(IdentityM) result.iterator().next(); 
     identityMemoPairs.add(Pair.of(im.identity,im.memo)); 
    } 
+0

嗯,我会说最好的方法是......读取集合并将转换后的值添加到列表中。没有更多。 :) - 严重的是,这有什么问题? – Thomas 2012-02-01 15:47:00

+0

检查http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist以了解List实现的性能。迭代时,没有区别。 – jalopaba 2012-02-01 15:54:11

+0

获取元素需要很长时间。 – michdraft 2012-02-01 15:57:28

回答

3

你的代码是错误的,因为你在while循环的每次迭代中创建一个新的迭代器(实际上你创建了它们中的两个)。每个新的迭代器都将指向result集合的开始处。因此你创建了一个无限循环。

要解决此问题,请仅调用result.iterator()一次并将结果存储在变量中。

但甚至更好(更好的阅读,更不容易出错)将是for-each循环,它是(几乎总是)的优选的变体来遍历集合:

for (IdentityM im : (Collection<IdentityM>)result) { 
    identityMemoPairs.add(Pair.of(im.identity,im.memo)); 
} 

编译器自动将使用迭代器将其转换为代码,因此没有性能差异。一般来说,只要您避免一些不好的事情,例如在LinkedList上调用get(i),则迭代集合时性能无关紧要。

请注意,编译器会在这里给出警告,这与迭代无关,但使用原始类型Collection(而不是Collection<IdentityM>)。如果可能,请检查handler.getResult()实际上是否返回Collection<IdentityM>并将result变量的类型更改为此。

另一个问题是,你是否真的需要该列表作为成对列表。通常不建议使用简单对类,因为它们的名称不显示它们所代表的对象的含义。例如,最好使用类PersonName,该类具有名字和姓氏的字段而不是Pair<String, String>。为什么你不能只使用List<IdentityM>?如果你可以使用这个,你确定你不能使用Collection<IdentityM>? (ListCollection通常是可以交换的。)然后你可以完全避免复制。

0

您的代码非常好,因为它是。但你可能会让handler直接返回对的集合,所以你可以调用identityMemoPairs.addAll()而不是自己迭代集合。但这只会使它“更漂亮”,它不会带来更多的性能。

相关问题