我有一个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循环吗?
非常感谢你的任何意见,为我的无知道歉。
答案 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)
我真的只有两种方法可以让你更加“高效”:
以某种方式在多个核心之间进行拆分,以便您可以并行完成工作。当然,这假设你已经有了其他内核,他们没有做任何有用的事情,并且正在进行足够的处理,无意中听到这样做甚至是值得的。我的猜测是(至少)最后一点在你的情况下是不正确的,因为你只是在呼唤一个吸气剂。如果你想这样做,你会尝试使用一些线程(我实际上可能会使用Executor和Futures)等于核心数量,然后为每个线程提供大致相等的工作量(可能只是将您的列表切成大致相同大小的部分)。
如果你相信你只会访问结果列表的一小部分,但不确定究竟是哪些元素,你可以尝试懒散地做事。最简单的方法是使用预先构建的延迟映射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建议。