2013-06-12 28 views
2

假設有兩個類別的兩個列表,分別是Class AClass B分別是listOfClassesAlistOfClassesB可以根據特定條件爲每個循環迭代嗎?

現在我需要在該假設布爾變量測試比迭代名單A否則乙真特定條件一個循環遍歷這些列表,所以我想類似下面

Boolean test = true; 
For(test ? A a:B b : test ? listOfClassesA : listOfClassesB){ 
    String id = test?a.getId():b.getId(); 
} 

我有,因爲這個要求在幾乎所有情況下,幾乎所有的代碼都是相同的,所以我不想重複循環兩次,但我沒有找到任何方法來做到這一點。有什麼辦法可以做到這一點?

+2

什麼是公用的超類型A''和'B'的? – johnchen902

+0

你不能在'?'宏中定義一個變量。條件如此複雜,看起來更適合「while」循環 – SJuan76

+0

不,你不能那樣做。你想要達到的是什麼? – fge

回答

4

不,Java不會讓你編寫這樣的循環。你可以做的是定義一個通用的方法*,並在你的循環體內調用該方法。這樣你就只需要重複循環頭文件,而不是循環體內的代碼。

if (test) { 
    for (A a : listOfA) loopBody(a); 
} else { 
    for (B b : listOfB) loopBody(b); 
} 
... 
private static <T> void loopBody(T item) { 
    ... 
} 


*如果兩個類是相關的,這需要他們共同的父類的方法將正常工作。

+0

不錯的解決方案,謝謝.. – commit

2

您可以實現一個實現Iterable接口的新類(可以匿名),該接口將返回迭代器負責迭代listOfClassesAlistOfClassesB。 但是,在您的迭代器的定義中,您只能使用類別AB常見的超級類型。

這就是我對心靈什麼:

interface I { } 
class A implements I { } 
class B implements I { } 

class MyIterator implements Iterable<I> { 
    private List<I> list; 

    public MyIterator(boolean test, List<A> listOfClassesA, List<B> listOfClassesB) { 
     super(); 
     this.list = new ArrayList<I>(test ? listOfClassesA : listOfClassesB); 
    } 

    @Override 
    public Iterator<I> iterator() { 
     return list.iterator(); 
    } 
} 

public class Test { 
    public static void main(String[] args) throws Exception { 
     List<A> listOfClassesA = new ArrayList<A>(); 
     List<B> listOfClassesB = new ArrayList<B>(); 

     for(I elm : new MyIterator(true, listOfClassesA, listOfClassesB)) { 
      // elm is of I type 
     } 
    } 
} 
相關問題