-1

groovy のリストから最後の要素以外をすべて削除するきちんとした方法を見つけようとしていますが、私が試したすべてのことは少し複雑すぎるようです。もっときちんとした方法はありますか?

失敗:java.util.ConcurrentModificationException

void removeAllButLastInPlace(list) {
    if(list.size() > 1) {
        def remove = list[0..-2]
        remove.each { list.remove(it) }
    }
}

失敗:java.lang.CloneNotSupportedException: java.util.ArrayList$SubList

void removeAllButLastInPlace(list) {
    if(list.size() > 1) {
        def remove = list[0..-2].clone()
        remove.each { list.remove(it) }
    }
}

動作しますが、リストの構築は不要のようです

void removeAllButLastInPlace(list) {
    if(list.size() > 1) {
        def remove = [] + list[0..-2]
        remove.each { list.remove(it) }
    }
}

動作しますが、少し難解なようです

void removeAllButLastInPlace(list) {
    (list.size() - 1).times { list.remove(0) }
}

WORKS、おそらく最も「正しい」

void removeAllButLastInPlace(list) {
    list.retainAll { list.lastIndexOf(it) == list.size() - 1 }
}

コードは次のテストを満たす必要があります。

list = []
removeAllButLastInPlace(list)
assert list == []

list = ['a']
removeAllButLastInPlace(list)
assert list == ['a']

list = ['a', 'b']
removeAllButLastInPlace(list)
assert list == ['b']

list = ['a', 'b', 'c']
removeAllButLastInPlace(list)
assert list == ['c']
4

3 に答える 3

2

既存のリストを変更するのではなく、新しいリストを返さないのはなぜですか?

次に、次のように簡単に実行できます。

List removeAllButLast( List list ) {
  list ? [list[-1]] : []
}

または:

List removeAllButLastInPlace( List list ) {
  list.drop( list.size() - 1 )
}

編集:

ループを使用することもできます(変更方法が必要な場合)

void removeAllButLastInPlace( List list ) {
   while( list.size() > 1 ) list.remove( 0 )
}
于 2013-02-13T09:05:56.673 に答える