2014-02-13 78 views
0

我有python背景,所以請允許我在python中有我的代碼。在Java中類似的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> >

看起來非常髒的解決方案給我。有沒有更簡單的方法來實現這一目標?

+2

有沒有在你的Python代碼示例沒有發電機... –

+0

@brunodesthuilliers'[X在列表中移除x如果x [ '看得見']]'是發電機。 – Rainbolt

+0

@John不!這是一個列表理解!在python中,生成器意味着生成器表達式(它是* not * list-comprehensions)或函數生成器(包含'yield'的函數)。 – Bakuriu

回答

0

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

} 
1

使用java.util.Map<CustomObject, Boolean>將對象映射到其可見狀態。

編輯獲取地圖中的所有可見項:

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中倒閉......