我有一个非常奇怪的问题,我想以非常有效的方式做到这一点。在我的应用程序毫秒计数..
我有四个ArrayLists
个字符串
title desc, price, usageArray;
前三个包含数据,其中usageArray包含数据,某些地方为“NONE”,例如
UsageArray
a b c NONE D NONE
等
我想从usageArray中删除“NONE”,例如让First NONE的索引为3,那么title,desc和price中的第三个元素也会被删除。
我怎样才能以极其有效的方式做到这一点
答案 0 :(得分:3)
首先,我建议您创建一个类,例如Book
,其中包含所有这些属性,并且有一个List<Book>
,而不是为所有属性创建4个不同的列表。< / p>
<强> 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
删除元素时应注意。在执行此操作时,应始终使用迭代器。
另见:
答案 1 :(得分:0)
试试这个
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--;
}
}
答案 2 :(得分:0)
这是经过测试的代码。 公共类mainclass {
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);
}
}
}
答案 3 :(得分:0)
这(照例)取决于。您的数据集有多大?您是否测试了一种基本方法并且看到它需要花费太多时间?例如,简单的LinkedLists在删除时更有效(与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
以获得更有效的比较或a
字符串常量因此不需要equals()
,而是可以使用usage == NONE
答案 4 :(得分:-1)
检查以下代码,
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);
}
}
}