0

我有一个非常奇怪的问题,我想以非常有效的方式做到这一点。在我的应用程序毫秒数..

我有四个ArrayLists字符串

title desc, price, usageArray;

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

UsageArray

a b c NONE D NONE

ETC

我想以这样的方式从usageArray中删除“NONE”,例如让First NONE的索引为3,然后标题中的第三个元素,desc和price也被删除。

我怎样才能以非常有效的方式做到这一点

4

5 回答 5

3

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

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

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

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

List<Book> books;

现在,要删除usageis的所有索引NULL,就像这样简单:

ListIterator<Book> iterator = books.listIterator();

while (iterator.hasNext()) {
    Book book = iterator.next();
    if (book.getUsage().equals("NULL")) {
        iterator.remove();
    }
} 

此外,无论您"Null"将字符串值用作何处,都应考虑将其更改为null.

注意:从List. 在执行此操作时,您应该始终使用迭代器

也可以看看:

于 2013-06-30T17:42:24.887 回答
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--;
        }

    }
于 2013-06-30T17:33:06.627 回答
0

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

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);

    }

}

}

于 2013-06-30T17:52:03.297 回答
0

这(像往常一样)取决于。你的数据集有多大?您是否测试过一种基本方法并发现它花费了太多时间?例如,简单的 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进行or进行更有效的比较enumintString 常量所以不需要equals(),可以改为使用usage == NONE
于 2013-06-30T17:53:02.873 回答
-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);

        }

    }





}
于 2013-06-30T17:34:54.427 回答