2016-10-21 5 views
0

2つのオブジェクト(Foo、Bar)のリストを定義して反復するにはどうすればよいですか?Java/Groovy:2つのオブジェクトのリストを作成して読み込みます。

// 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

「新しいAbstractMap.SimpleEntryを試すことができます。(...)」 –

+1

正確に何をしようとしているのかは不明です。リストの各要素がFooまたはBarのいずれかであるリストを作成しようとしていますか?もしそうなら、 'ArrayList 'が必要です。あなたがFoosとBarsのペアのリストを作成しようとしているように思えるかもしれません。その場合は、あるライブラリにある 'Pair 'クラスをどこかで使うか、自分で書く必要があります。それ。 – user3030010

+0

@ user3030010私が理解しているように、OPは正確に2つの要素のリストを望んでいます:1つのFooと1つの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'があります:' new Tuple2 (foo、bar) ' –

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の順番でインスタンスを含む2要素のリストです。

各2要素のFoo/Barリストを作成する際の安全性を高めるために、TypeCheckedのヘルパーメソッドを記述し、変更後の改ざんを防ぐための不変のリストを返します。

一種危険領域は、他のオブジェクトタイプを移入することができるfooBarsリスト、です。しかし、あなたがそのタイプの安全性の程度を望むなら、多分あなたは別の言葉を完全に考慮する必要があります。

+0

ありがとうございます。 「別の言語を考える」とはどういう意味ですか? (私はPHP world btwから来ています:) :) – MonkeyMonkey

+0

ジェネリックを使い、何かを意味したいのであれば、GroovyではなくJavaを考慮する必要があります。Groovyは、デフォルトでは、厳密にジェネリックシグネチャを守るわけではありません。コード 'List list = ['hi'、 'there']'をうまく実行します。しかし、この緩みに対処する最良の方法は、私の意見では、Groovyの姿勢を抱き、あなたのコードを 'def list = ['hi'、 'there']'として書くことです。しかし、全体的には、PHPの観点から見れば、Groovyがうまくいくでしょう。 – bdkosher

0

誰も地図を提案していないのはなぜですか?

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

タプルのリストより少しスマートに見えます。

関連する問題