2016-10-21 49 views
0

如何定義和遍歷兩個對象(Foo,Bar)的列表?Java/Groovy:創建並讀取兩個對象的列表

我試了一下:

// create 
def fooBar = new ArrayList<Foo, Bar>() 
fooBar.add(new Foo()) 
fooBar.add(new Bar()) 
fooBar.add(new Foo()) // << shouldn't be allowed or overwrite first foo 

def fooBars = new ArrayList<List<Foo, Bar>>() 
fooBars << fooBar 

// read 
fooBars.each { fooBar -> 
    def foo = fooBar[0] 
    def bar = fooBar[1] 
    // do something with foo and bar 
} 

我想要什麼:

// pseudo code 
def fooBar = new ???<Foo, Bar>() 
fooBar.set(new Foo()) 
fooBar.set(new Bar()) 

def fooBars = new ArrayList<???>() 
fooBars << fooBar 

fooBars.each { fooBar -> 
    def foo = fooBar[???] // 0, 'foo', ..? 
    def bar = fooBar[???] 
    // do something with foo and bar 
} 

如果創建我自己的FooBar的類是解決我沒事,我只是希望有一個更簡單的解決方案。

+0

你可以試試'new AbstractMap.SimpleEntry (...)' –

+1

目前還不清楚你到底想要做什麼。你想創建一個列表,其中每個元素是Foo還是Bar?如果是這樣,那麼你想'ArrayList '。這聽起來像你也可能試圖創建一對Foos和Bars對,在這種情況下,你可能需要使用某些庫中給定的'Pair '類,或者編寫自己的類,然後列出那。 – user3030010

+0

@ user3030010按照我的理解,OP需要一個正好包含2個元素的列表:一個Foo和一個Bar。換句話說,一個元組/一對。 –

回答

4

Groovy的概念是Tuples

def tuple = new Tuple('one', 1) 
def (String a, Integer b) = tuple 
println a 
println b 

或可替代

def doSomething(String s, Integer i) { 
    println s 
    println i 
} 
doSomething(tuple) 

或可替代

def doSomething(Tuple t) { 
    println t[0] 
    println t[1] 
} 
doSomething(tuple) 

那麼你可以做

def tuples = [ ] << tuple << tuple 
tuples.each { doSomething(it) } 
+1

如果你想要的泛型,有'Tuple2',即:'新Tuple2 (富,酒吧)' –

1

考慮Groovy的Expando。例如:

class Foo {} 
class Bar {} 

def fooBar = new Expando() 
fooBar."foo" = new Foo() 
fooBar."bar" = new Bar() 

def fooBars = [] 
fooBars << fooBar 

fooBars.each { item -> 
    def foo = item."foo" 
    def bar = item."bar" 

    assert foo instanceof Foo 
    assert bar instanceof Bar 
} 
1

爲什麼不直接使用列表清單?列表中的每個元素可以是一個包含FooBar實例的兩元素列表。

爲了在構建每個兩元素Foo/Bar列表時增加安全性,編寫一個TypeChecked的幫助器方法並返回一個不可變列表以防止構建後篡改。

的一種類型的不安全的區域是fooBars列表,其可以與其他對象類型來填充。但是如果你想要那種類型的安全性,那麼也許你應該完全考慮一種不同的語言。

+0

謝謝你的答案。 「考慮不同的語言」是什麼意思? (我來自PHP世界btw):) – MonkeyMonkey

+0

我只是想說如果你想使用泛型並讓它們有意義,你應該考慮Java而不是Groovy。Groovy默認情況下不嚴格遵守通用簽名;它會高興地運行代碼'List list = ['hi','there']'。但在我看來,處理這種鬆散的最好方法是採用Groovy的態度,並將代碼編寫爲「def list = ['hi','there']'。總體而言,如果您來自PHP角度,我認爲Groovy將很適合您。 – bdkosher

0

爲什麼沒有人提出地圖?

def x = [:] 
x['foo'] = new Bar() 

似乎比元組列表更聰明。