我的android设备上有数以千计的记录SQLite数据库,我需要从它们快速构建一个ArrayList来查看一些记录。那么哪一个更快?
List<Items> values = database.getAllItems();
List<Items> valuesBuffer = new ArrayList<Items>();
for (Items item : values) {
if ((item.getItemToScan() == 1) &&
(item.getItemScanned() != item.getItemAmount()))
{
valuesBuffer.add(item);
}
}
或者
List<Items> values = database.getAllItems();
List<Items> valuesBuffer = new ArrayList<Items>(values);
for (Items item : values) {
if ((item.getItemToScan() != 1) ||
(item.getItemScanned() == item.getItemAmount()))
{
valuesBuffer.remove(item);
}
}
也可能检查或(||)逻辑平均花费更多时间......
答案 0 :(得分:1)
我认为这个问题没有明确的答案。但是如果你对这些值有一些了解,你可以做一些优化。
如果您希望删除(或在第一种情况下添加)大多数元素,那么更好的解决方案是使用方法一,因为您不会执行多次删除。如果你希望删除一些元素,最好使用第二种方法,因为复制数组比逐个添加元素便宜。
答案 1 :(得分:1)
第一个。
因为remove
无论如何都是o(n)
操作(在这种情况下,因为/你需要找到项目的索引而b /你需要将所有项目向下移动一行),复杂性为o(n^2)
。
第一个的复杂性是摊销o(n)
,并且通过初始化足够大小的arraylist可以是o(n)
new ArrayList<Items>(values.size());
所有这些都取决于过滤掉的项目数量。如果已知该数字与常数有关,则在两种情况下复杂度都变为o(n)
。如果不知道,上面的答案就是。