如何使用现有列表的成员变量创建java列表,而不使用for循环?

时间:2009-12-10 18:07:12

标签: java list collections

我有一个java列表

List<myclass> myList = myClass.selectFromDB("where clause");

//myClass.selectFromDB returns a list of objects from DB

但我想要一个不同的清单,特别是。

List<Integer> goodList = new ArrayList<Integer>();

for(int i = 0;i++; i<= myList.size()) {
    goodList[i] = myList[i].getGoodInteger();
}

是的,我可以在最初的myList创建中从数据库执行不同的查询,但现在假设我必须使用它作为起点,而不是其他数据库查询。我可以用更高效的东西替换for循环吗?

非常感谢你的任何意见,为我的无知道歉。

4 个答案:

答案 0 :(得分:3)

为了从“myclass”中提取字段,您将不得不遍历列表的全部内容。无论你是使用for循环,还是使用某种隐藏for循环的构造,它仍然需要大约相同的时间并使用相同数量的资源。

答案 1 :(得分:3)

一个重要的问题是:你为什么要这样做?你想让你的代码更干净吗?如果是这样,你可以写下这些方法:

public static List<Integer> extractGoodInts (List<myClass> myList) {
    List<Integer> goodInts = new ArrayList<Integer>();

    for(int i = 0; i < myList.size(); i++){
        goodInts.add(myList.get(i).getGoodInteger());
    }

    return goodInts;
}

然后,在你的代码中,你可以去:

List<myClass> myList = myClass.selectFromDB("where clause");
List<Integer> goodInts   = myClass.extractGoodInts(myList);

但是,如果您尝试提高代码效率并且不允许更改查询,那么您运气不好;不知何故,你需要从列表中单独抓取每个int,这意味着无论你能想出什么聪明的技巧,你都会在O(n)时间内运行。

答案 2 :(得分:0)

我真的只有两种方法可以让你更加“高效”:

  1. 以某种方式在多个核心之间进行拆分,以便您可以并行完成工作。当然,这假设你已经有了其他内核,他们没有做任何有用的事情,并且正在进行足够的处理,无意中听到这样做甚至是值得的。我的猜测是(至少)最后一点在你的情况下是不正确的,因为你只是在呼唤一个吸气剂。如果你想这样做,你会尝试使用一些线程(我实际上可能会使用Executor和Futures)等于核心数量,然后为每个线程提供大致相等的工作量(可能只是将您的列表切成大致相同大小的部分)。

  2. 如果你相信你只会访问结果列表的一小部分,但不确定究竟是哪些元素,你可以尝试懒散地做事。最简单的方法是使用预先构建的延迟映射List实现。 Google Collections Library中有一个。您可以通过拨打Lists.transform()来使用它。它会立即返回一个List,但它只会在请求时对元素执行转换。同样,如果事实证明您只查看输出列表的一小部分,那么这只会更有效。如果你最终看到整个事情,这将不会更有效率,并可能会降低效率。

答案 3 :(得分:0)

不确定你的意思是什么?正如其他人所说,你必须以这种或那种方式对该列表的每个元素调用getGoodInteger方法。关于您可以做的最好的事情是避免每次都检查size

List<Integer> goodInts = new ArrayList<Integer>();
for (MyClass myObj : myList) {
   goodInts.add(myObj.getGoodInteger());
}

我还提出了为此目的制作功能的第二个jboxer建议。