Simple ArrayList删除相同的内容



我有一个非常奇怪的问题,我想用非常有效的方式来解决。在我的应用程序中,毫秒计数。。

我有四个字符串的ArrayLists

title desc, price, usageArray;

前三个包含数据,其中usageArray包含数据,在某些地方"NONE",例如

UsageArray

a b c NONE D NONE

etc

我想从usageArray中删除"NONE",例如,如果First NONE的索引为3,那么title、desc和price中的第三个元素也将被删除。

我如何才能以极其高效的方式做到这一点

首先,我建议您创建一个类,比如Book,包含所有这些属性,并有一个List<Book>,而不是所有属性都有4个不同的列表。

p.S.: 通常,每当您看到自己并行修改或处理多个列表时,这表明是时候创建一个新类了。

class Book {
    String title;
    String desc;
    BigDecimal price;
    String usage;
}

然后你有一个这样的列表:

List<Book> books;

现在,删除usageNULL的所有索引,就像一样简单

ListIterator<Book> iterator = books.listIterator();
while (iterator.hasNext()) {
    Book book = iterator.next();
    if (book.getUsage().equals("NULL")) {
        iterator.remove();
    }
} 

此外,无论您在哪里使用"Null"作为字符串值,都应该考虑将其更改为null

注意:从List中删除元素时应注意。在执行此操作时,您应该始终使用迭代器

另请参阅:

  • 遍历集合,在循环中删除时避免ConcurrentModificationException

这是经过测试的代码。公共类主类{

public static void main(String ar[])
{
    List<Integer> indexes = new ArrayList<Integer>();

    List<String> title = new ArrayList<String>();
        title.add("title 1");
        title.add("title 2");
        title.add("title 3");
    List<String> desc = new ArrayList<String>();
        desc.add("desc 1");
        desc.add("desc 2");
        desc.add("desc 3");
    List<String> price = new ArrayList<String>();
        price.add("price 1");
        price.add("price 2");
        price.add("price 3");
    List<String> usageArray = new ArrayList<String>();
        usageArray.add("usage 1");
        usageArray.add("NONE");
        usageArray.add("usage 1");

    for (String string : usageArray) {
        if(string.equalsIgnoreCase("NONE"))
        {
            indexes.add(usageArray.indexOf(string));
        }
    }

    for (Integer index : indexes) {
        price.remove(index);
        desc.remove(index);
        title.remove(index);
        usageArray.remove(index);
    }
}

}

试试这个

   int index = 0;
    for (int i = 0; i < usageArray.size(); i++) {
        if (usageArray.get(i).contains("NONE")) {
            index=usageArray.indexOf("NONE");
            usageArray.remove(index);
            title.remove(index);
            desc.remove(index);
            price.remove(index);
            i--;
        }
    }

这(像往常一样)取决于。您的数据集有多大?你是否测试了一种基本方法,发现它花费了太多时间?例如,当涉及到删除时,简单的LinkedList(与ArrayList相比)更有效。你想最终得到什么,一个可以以什么方式快速查找事物的数据结构?按索引?用钥匙?你需要什么才能快速,在实际过滤过程中还是在过滤完成后?

即使在简单的情况下,也有多种方法可以做到这一点。将合并为一个对象,每个列都有字段:

class Data {
  String title;
  String desc;
  String price;
  String usage;
}

然后:

LinkedList<Data> allData = ...;
for (Iterator iter=allData.iterator();iter.hasNext();) {
  Data data = iter.next();
  if ("NONE".equals(data.usage)) { //see note about using something else here
    iter.remove();
  }
}
//allData is now cleaned of any entries with USAGE of NONE

通常比使用ArrayList更快,当然比使用多个列表等更快。但再次取决于情况。

例如,根据您的数据建模需求,可能希望在单独的类中使用。

为了进一步的性能,无论算法如何(这是重要的部分,所以只是为了好玩,总是要测量!)考虑:

  • usage设为enumint以进行更有效的比较或字符串常量,因此不需要equals(),可以使用usage == NONE

检查以下代码,

public static void main(String ar[])
{
    List<String> title = new ArrayList<String>();
        title.add("title 1");
        title.add("title 2");
        title.add("title 3");
    List<String> desc = new ArrayList<String>();
        desc.add("desc 1");
        desc.add("desc 2");
        desc.add("desc 3");
    List<String> price = new ArrayList<String>();
        price.add("price 1");
        price.add("price 2");
        price.add("price 3");
    List<String> usageArray = new ArrayList<String>();
        usageArray.add("usage 1");
        usageArray.add("NONE");
        usageArray.add("usage 1");

    int index = -1;
    for (String string : usageArray) {
        if(string.equalsIgnoreCase("NONE"))
        {
            index = usageArray.indexOf(string);
                    usageArray.remove(string);
                    price.remove(index);
                    desc.remove(index);
                    title.remove(index);
        }
    }


}

最新更新