2

takeおよびdropメソッドはgroovyv1.8.1でリストオブジェクトに追加され、次のように機能します。

def list = ['Simple', 'list', 'with', 5, 'items']   
assert list.take(2) == ['Simple', 'list']  

私はv1.8.0しか利用できません。Groovy v1.8.0を使用して自分のバージョンのlist.take(2)を再実装するにはどうすればよいですか?

次のようなことは可能ですか?

def list = ['Simple', 'list', 'with', 5, 'items']  
def limit = 2 
assert list['0..'+limit] == ['Simple', 'list']  

これを試してみると、例外が発生します。

4

3 に答える 3

1

あなたはそれをgroovyがするように行うことができます

https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L6498

public static <T> List<T> take(List<T> self, int num) {
    if (self.isEmpty() || num <= 0) {
        return createSimilarList(self, 0);
    }
    if (self.size() <= num) {
        List<T> ret = createSimilarList(self, self.size());
        ret.addAll(self);
        return ret;
    }
    List<T> ret = createSimilarList(self, num);
    ret.addAll(self.subList(0, num));
    return ret;
}

メソッドcreateSimilarListはここにあります

https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java#L162

于 2012-12-17T18:44:41.843 に答える
1

スライスは同じ目標を達成する可能性があります。

def list = ['Simple', 'list', 'with', 5, 'items']   
assert list[0..1] == ['Simple', 'list']  
于 2012-12-17T18:45:37.240 に答える
1

GargantuChetの答えと同じように、スライスすることができますが、排他的な範囲を使用します。

List.metaClass.take { n ->
    def len = [n,delegate.size()].min()
    delegate[0..<len]
}

assert [1,2,3,4].take(2) == [1,2]
assert [1,2].take(2) == [1,2]
assert [1].take(2) == [1]
assert [].take(2) == []
于 2012-12-17T19:39:03.660 に答える