Groovyの2つのリストの内容を合計する

arraylist groovy sum
Groovyの2つのリストの内容を合計する

Groovyには2つのリストがあり、両方の内容を合計する必要があります。

例えば:

list1 = [1,1,1]
list2 = [1,1,1]

私はこの結果を期待しました:

total = [2,2,2]

” ” ‘

+ operator o .sumメソッドで合計しようとしましたが、リストの連結があります。

[1, 1, 1, 1, 1, 1]

Groovyで十分なGroovyか、リストの各要素をループする必要がありますか?

  12  0


ベストアンサー

Groovyのhttp://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/List.html#transpose()[List.transpose()]は、他の言語では `zip`のように動作します。 これを試して:

list1 = [1,2,3]
list2 = [4,5,6]
assert [list1, list2].transpose()*.sum() == [5,7,9]

33


組み込みのソリューションはわかりませんが、 collect`とJavaの Queue`の `poll()`メソッドを使用した回避策があります。

def list1 = [1, 2, 3]
def list2 = [4, 5, 6] as Queue

assert [5, 7, 9] == list1.collect { it + list2.poll() }

4


ほとんどの関数型プログラミング言語では、これは map2(ocaml)または` zipWith`(haskell)関数を使用して行われます。たとえば:

let total = List.map2 (+) list1 list2;;

groovyのドキュメントには同等のものは見つかりませんでしたが、明らかに、「zipWith」を簡単に定義できます(http://cs.calstatela.edu/wiki/index.php/Courses/CS_537/Summer_2008/Chapter_4._Collective_Groovy_datatypesにあります) ):

zipWith = {f, a, b ->
 result = []
 0.upto(Math.min(a.size(), b.size())-1){index -> result << f(a[index], b[index])}
 result}

assert zipWith({x, y -> x + y}, [1, 2, 3], [4, 5, 6, 7]) ==  [5, 7, 9]

2


プロトタイプ(JavaScriptフレームワーク)にはhttp://www.prototypejs.org/api/enumerable/zip[method zip()]があり、まさに必要なことを行います。 しかし、それはあなたを助けません、私は知っています。 おかしい、私はGroovyが似たようなものを持っていることを期待していましたが、http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html [Collection]またはhttpのいずれでも見つけることができませんでした: //groovy.codehaus.org/groovy-jdk/java/util/List.html [List]クラス。

とにかく、これはあまりにもきれいではない `zip()`の実装です:

List.metaClass.zip = { List other, Closure cl ->
    List result = [];
    Iterator left = delegate.iterator();
    Iterator right = other.iterator();
    while(left.hasNext()&& right.hasNext()){
        result.add(
            cl.call(left.next(), right.next())
        );
    }
    result;
}

そして、ここで動作しています:

def list1 = [1, 1, 1]
def list2 = [1, 1, 1]

print (list1.zip(list2) {it1, it2 -> it1 + it2})

出力:

_
{空} [2、2、2]
_

” ” ‘

もちろん、あなたがあなたの問題を正確に解決したい場合(そして、一般的なzip / map関数を実装しない場合)、あまり一般的でない方法でそれを行うこともできます:

List.metaClass.addValues = { List other ->
    List result = [];
    Iterator left = delegate.iterator();
    Iterator right = other.iterator();
    while(left.hasNext()&& right.hasNext()){
        result.add(
            left.next() + right.next()
        );
    }
    result;
}

def list1 = [1, 1, 1]
def list2 = [1, 1, 1]

print (list1.addValues(list2))
// Output again: [2, 2, 2]

1


少し読みにくい。* sum()解決策を見つけた場合(非常に良いことですが)、これも実行できます。

l1=[1,2,3]
l2=[4,5,6]

println([l1,l2].transpose().collect{it[0]+it[1]})

もちろん、単に加算するよりも複雑な計算が可能です。

0


タイトルとURLをコピーしました