2015-04-08 15 views
8

Groovy'de bazı veri odaklı testler yaparken garip bir şeyle karşılaştım. Eğer önemliyse, bu bir Spock testinin içinde.Bu Groovy yapısı nedir ve sözdizimi nasıl çalışır?

def list = [[1, 2, 3], 
       [4, 5, 6], 
       [7, 8, 9]] 

    println list[0] 

üretir: Burada

listeleri çalışması gereken bu yol, bence

[1, 2, 3] 

yanlışlıkla böyle bir şey yaptı:

def whut = [[1, 2, 3] 
       [4, 5, 6] 
       [7, 8, 9]] 

    println whut[0] 
    println whut 

hangi çıkışlar:

[null, null, null] 
[[null, null, null]] 

Tamam, Groovy'nin virgül olmadan deklarasyonu sevmediğini görebiliyorum - ama derler, bu nedir? Aşağıdaki

def inputz = [ 
      [1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
      [1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1   ] 
      [3, 0.823506476, 0.31230335, 0.631237191, 1, 1, 0   ] 
      [4, 0.934875788, 0.486395986, 0.66732053, 3, 2, 0.927654169] 
      [4, 0.699869773, 0.234328294, 0.424739329, 3, 3, 1   ] 
    ] 

    println inputz[0] 
    println inputz 

verir: - Ben yaratıyorum Groovy yapı nedir ve neden

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

Tamamen burada kayboldum İşte

gerçekten bu sözdizimi hakkında bana atar ne Bu görünüşte rastgele değerleri listelerimden mi çıkarıyor?

Teşekkürler, ve benim soru için daha açıklayıcı bir isim düşünüyorsanız, bunu değiştireceğim.

+0

Bu harika soruyu #groovypuzzlers'ın ikinci sezonunda bir puzzler olarak kullandık ve size bir teşekkür t-shirt'ü göndermek istiyoruz. Sana nasıl ulaşabilirim? – JBaruch

cevap

9

Yani

def whut = [[1, 2, 3] 
      [4, 5, 6] 
      [7, 8, 9]] 

, bir liste [1,2,3] oluşturur 4, 5 ve (var olmayan) 6 sana üç nulls listesini vermek, sonra da elemanını 7,8 ve 9 erişir elemanlarını erişir

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
[1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1   ] 
.... 
: (yine üç boş değerlere döndürülür) deliklerle bu liste

Daha sonra bu örnek ile bir liste

üç deliklerle bu listeyi sarar 1, 0þ, 0þ, 0þ, 1., 1. ve 1st vermek

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
[1, 0, 0, 0, 1, 1, 1] 

ve benzeri

[0.631226308, 1, 1, 1, 0.631226308, 0.631226308, 0.631226308] 
vb

ile biter:

o kadar deler.

> [[1,2][3,4]] 
===> [[null, null]] 

Ama ekstra dizi gerekmez, bu yüzden bu paketini edebilirsiniz:

+0

0-1 olasılık sorunu üzerinde çalışmamı çok daha açık olurdu. Yazılı açıklamalarınız için teşekkürler. – orbfish

6

(groovysh cinsinden) daha küçük bir örnek içine bu aşağı Breaking

> [1,2][3,4] 
===> [null, null] 

Bu aslında olduğu

> [1,2][1] 
===> 2 

Ama endeksi kapalı dizinin sonunu ise: normalde şuna benzer liste endeksleme tür,

> [1,2][2] 
===> null 

O harika destekler bu sözdizimi (Daha fazla örnek için http://groovy-lang.org/groovy-dev-kit.html#Collections-Slicingwiththesubscriptoperator bakınız) bir parçası olarak dilimleme, çıkıyor, bu yüzden yapabilirsiniz:

> [1,2,3][2,0] 
===> [3, 1] 

birinci eleman tarafından takip 3 elemanı almak için.

Ama birleştirerek bu iki gerçekler: Biz bize iki boş değerlere vererek tekrar dizinin sonunun indeksleme, ama bir dilim ediyoruz

> [1,2][3,4] 
===> [null, null] 

.

+0

2 büyük cevap, keşke her ikisini de kontrol edebilirdim! – orbfish