【问题标题】:How can I create a java list using the member variables of an existing list, without using a for loop?如何在不使用 for 循环的情况下使用现有列表的成员变量创建 java 列表?
【发布时间】:2009-12-10 18:07:12
【问题描述】:

我有一个 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 循环吗?

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

【问题讨论】:

    标签: java list collections


    【解决方案1】:

    为了从“myclass”中提取一个字段,您将不得不遍历列表的全部内容。无论您是使用 for 循环,还是使用某种结构对您隐藏 for 循环,都将花费大致相同的时间并使用相同数量的资源。

    【讨论】:

      【解决方案2】:

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

      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) 时间内运行。

      【讨论】:

      • 你不能在 Java 中创建 List
      • 另请注意,此方法是静态的,它指出了潜在的设计缺陷。它实际上应该是包装 List 的类的成员方法。这样做,您就可以开始实际的 OO 设计了……
      • Don:很好的调用 int 的东西。自从我使用 Java 以来已经有一段时间了。 Bill K: 同意,尽管对这样的事情包装清单可能有点矫枉过正。我同意你的观点,OO 设计可以更简洁,但我可能会认为它是不必要的复杂性,并且只有在我们最终为其他类型(双精度数、字符串等)和其他表重复此代码时才应该像这样重构。
      【解决方案3】:

      我能想到的只有两种方法可以让这更“高效”:

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

      2. 如果您认为您只会访问结果列表的一小部分,但不确定究竟是哪些元素,您可以尝试懒惰地做事。最简单的方法是使用预先构建的惰性映射列表实现。 Google Collections Library 中有一个。您可以通过调用Lists.transform() 来使用它。它会立即返回一个列表,但它只会根据请求对元素执行转换。同样,如果您只查看输出列表的一小部分,这只会更有效。如果你最终看到整个事情,这不会更有效率,而且可能会降低效率。

      【讨论】:

        【解决方案4】:

        不确定您所说的高效是什么意思。正如其他人所说,您必须以一种或另一种方式对该列表的每个元素调用getGoodInteger 方法。你能做的最好的就是避免每次都检查size

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

        我也同意 jboxer 的建议,为此目的创建一个函数。

        【讨论】:

        • 不能在 Java 中创建 List
        猜你喜欢
        • 2018-03-18
        • 2015-09-09
        • 1970-01-01
        • 2017-10-25
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 2022-08-23
        • 1970-01-01
        相关资源
        最近更新 更多