我有一个非常奇怪的问题,我想用非常有效的方式来解决。在我的应用程序中,毫秒计数。。
我有四个字符串的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;
现在,删除usage
是NULL
的所有索引,就像一样简单
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
设为enum
或int
以进行更有效的比较或字符串常量,因此不需要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);
}
}
}