迭代集合类的最佳方法是什么?

时间:2014-02-28 15:26:35

标签: java collections

伙计们,我想问一下迭代集合类的最佳方法吗?

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 ..

4 个答案:

答案 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)

在找到要删除的元素后尝试暂停。