【问题标题】:Python's generators similar in JavaPython 的生成器在 Java 中类似
【发布时间】:2014-03-12 21:39:19
【问题描述】:

我有 python 背景,所以请允许我在 python 中使用我的代码。

在 Java (Android) 中有一个 arrayList<customObject>。在每个customObject 中对应一个布尔值(用于可见性)。

我希望尽可能高效地执行操作来检查可见性布尔值。在 python 中,我会创建一个生成器。

假设我的架构是:

list = [{"item": customObject, "visible": boolean}, {...}, {...}]
visible_matches = [x for x in list if x['visible']] 

for match in visible_matches: 
    dosomething(match)

或替代架构:

list = [[ customObject, boolean], [...], [...]]
visible_matches = [x for x in list if x[1]]

我如何在 Java 中执行相同的操作?

arrayList<arrayList<boolean,customObject>>arrayList< SimpleEntry<"item",customObject>, SimpleEntry<"visible",boolean> >

对我来说是一个非常肮脏的解决方案。有没有更简单的方法来实现这一点?

【问题讨论】:

  • 您的 Python 代码示例中没有生成器...
  • @brunodesthuilliers [x for x in list if x['visible']] 是一个生成器。
  • @John 不!这是一个列表理解!在 python 中,生成器意味着生成器表达式(not 列表理解)或函数生成器(包含yield 的函数)。
  • @Bakuriu 你完全正确。当我第一次阅读它时,我阅读了list(x for x in list if x['visible'])。现在我看到没有清单。这是()和[]之间的区别。很抱歉!

标签: java android python arraylist


【解决方案1】:

使用 java.util.Map<CustomObject, Boolean> 将对象映射到其可见状态。

EDIT 获取地图中的所有可见项目:

Map<CustomObject, Boolean> items = ...;
List<CustomObject> visibleItems = new ArrayList<CustomObject>();

for (Map.Entry<CustomObject, Boolean> entry : items.entrySet()) {visibleItems
    CustomObject customObject = entry.getKey();
    Boolean objectVisible = entry.getValue();

    if (objectVisible) {
        visibleItems.add(customObject);
    }
}

我真的很怀念 Java 中的闭包之类的东西......

【讨论】:

    【解决方案2】:

    Java 没有与 Python 相同的生成器(迭代器不是完全相同的东西)。像在 Python 中那样动态创建自定义对象也不起作用。因为 Java 是强类型的,所以必须先定义自定义对象,然后才能使用它。 Python 不是强类型的。

    在一个单独的文件中,试试这个起始代码。我将我的命名为class MyCustomObject,因为它位于 MyCustomObject.java 中。名称必须匹配。

    public class MyCustomObject {
    
        public boolean visible;
    
        // Constructor
        public MyCustomClass(boolean visible) {
            this.visible = visible;
        }
    
    }
    

    现在您有了一个自定义对象,您可以在主类中像这样实例化和操作它。我打电话给我的class Main,因为它在 Main.java 中。

    public class Main {
    
        public static void main(String[] args) {
    
            ArrayList<MyCustomObject> list = new ArrayList<>();
            list.Add(new MyCustomObject(true));
            list.Add(new MyCustomObject(false));
            list.Add(new MyCustomObject(true));
            list.Add(new MyCustomObject(true));
    
            ....
    
            for (MyCustomObject potentialMatch: list) {
                if(obj.visible) 
                    doSomething(potentialMatch);
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2011-01-31
      • 2016-01-19
      • 2015-09-16
      • 2012-08-29
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多