伙计们,我想问一下迭代集合类的最佳方法吗?
private ArrayList<String> no = new ArrayList<String>();
private ArrayList<String> code = new ArrayList<String>();
private ArrayList<String> name = new ArrayList<String>();
private ArrayList<String> colour = new ArrayList<String>();
private ArrayList<String> size = new ArrayList<String>();
// method for finding specific value inside ArrayList, if match then delete that element
void deleteSomeRows(Collection<String> column, String valueToDelete) {
Iterator <String> iterator = column.iterator();
do{
if (iterator.next()==valueToDelete){
iterator.remove();
}
}while(iterator.hasNext());
}
deleteSomeRows(no, "value" );
deleteSomeRows(code, "value" );
deleteSomeRows(name , "value");
deleteSomeRows(colour ,"value" );
deleteSomeRows(size , "value");
上面的代码存在的问题是,是否需要花费大量时间来迭代这些课程?什么解决方案让它更快?如果你关心,请帮忙:D ..
答案 0 :(得分:1)
您可以简化代码:
while column.contains(valueToDelete)
{
column.remove(valueToDelete);
}
您无法加速ArrayList迭代,特别是如果您的列表未排序。你因为这个问题而被困在O(n)。如果您对其进行排序并插入逻辑以二进制搜索要删除的项目,直到找不到它为止,则可以加快访问速度。
下一个建议与所花费的时间没有直接关系,但它会给你带来麻烦。
您不应该使用==
运算符比较String对象的相等性。这将导致它们的指针值的比较。
请改用:
if (iterator.next().equals(valueToDelete))
答案 1 :(得分:0)
如果要在迭代时修改集合,则应使用迭代器,否则可以使用for-each循环。
For -each:
// T is the type f elements stored in myList
for(T val : myList)
{
// do something
}
答案 2 :(得分:0)
编辑:这里的问题不是迭代。问题是从ArrayList
删除元素。当您从ArrayList
中删除第一个元素时,所有后续元素都必须向左移动一个位置。因此,在最坏的情况下,您当前的方法将具有二次复杂性。
一般来说很难避免这种情况。但在这种情况下,简单性和性能之间的最佳权衡可能是这样实现的:您不是从原始列表中删除元素,而是创建一个 new 列表包含不的元素等于“valueToDelete”。
例如,这可能是这样的:
import java.util.ArrayList;
import java.util.List;
public class QuickListRemove
{
public static void main(String[] args)
{
List<String> size = new ArrayList<String>();
size = deleteAll(size, "value");
}
private static <T> List<T> deleteAll(List<T> list, T valueToDelete)
{
List<T> result = new ArrayList<T>(list.size());
for (T value : list)
{
if (!value.equals(valueToDelete))
{
result.add(value);
}
}
return result;
}
}
答案 3 :(得分:0)
在找到要删除的元素后尝试暂停。