2009-02-14 5 views
2

(Pouvez-vous dire que j'apprends Ruby aujourd'hui? :))Le moyen le plus élégant de vérifier l'égalité dans la taille des sous-réseaux dans un tableau multidimensionnel?

Je veux déterminer si le tableau multidimensionnel avec lequel je travaille est un 'rectangle' - c'est-à-dire que les lignes ont la même taille. Voici ce que je fais, qui fonctionne mais se sent maladroit. Fondamentalement, je vérifie si la taille du premier tableau est égale à la taille de l'autre tableau. D'une certaine manière, il semble que ce n'est pas assez "rubis", vous savez? Quelqu'un at-il des solutions plus élégantes?

Répondre

1

Cela ne soulèvera pas une erreur:

@my_array = [[1,2,3,4],[1,2,3,4]] 
for row in @my_array 
    if row.size != @my_array.first.size 
    raise "This array is not a rectangle" 
    end 
end 

Cela soulèvera une erreur:

@my_array = [[1,2,3,4],[1,2,3]] 
for row in @my_array 
    if row.size != @my_array.first.size 
    raise "This array is not a rectangle" 
    end 
end 

Ce code parcourt tous les sous-tableaux du tableau et vérifie si leur taille de ligne n'est pas la même que la taille du premier, puis déclenche une erreur si c'est le cas.

1

je pourrais faire quelque chose comme les autres ont posté, ou

if 1 == @myArray.map { |row| row.size }.uniq.size 
    # ... 
end 

Vous devriez noter que votre code exemple ne fait pas ce que vous pensez qu'elle

# this creates an array that holds a slice 
# of elements from @myArray (a to b inclusive) 
@myArray[ a .. b ] 
# this just gets the size of the slice 
# (equal to b-a+1) 
@myArray[a .. b].size 

Ainsi, votre instruction if fait a comparé à l'argument rowsize avec la taille de colonne (plus 1, puisqu'il était de 0 à @ myArray.size inclus). Il n'a pas comparé la taille de chaque rangée avec la première. Pour ce faire, vous devez explicitement itérer, en utilisant chaque carte ou une autre méthode.

+1

Vous pouvez également utiliser @ myArray.map (&: size) .uniq.one? 'La méthode' Enumerable # one? 'A été introduite dans Ruby 1.8.7. –

Questions connexes