Participer à une programmation compétitive dans le cadre de l'apprentissage de Ruby et des algorithmes. Ici, nous sortons ce que nous avons appris pendant l'apprentissage.
Cette fois, comment créer un tableau à deux dimensions. Dans le 3e test d'algorithme 2e question Score dynamique Il y a une scène dans laquelle je veux utiliser un tableau à deux dimensions. J'ai eu un petit problème ici, donc je vais le résumer pour examen.
Je voulais faire quelque chose comme ce qui suit, alors j'ai décidé de créer un tableau à deux dimensions.
Par exemple Trois participants (1, 2, 3) participent à un examen. L'examen comportera trois questions. Gérez si chaque participant a pu répondre à chaque question.
L'image ressemble à celle ci-dessous.
image
#① Créez un tableau à deux dimensions comme celui-ci
[[0, 0, 0],[0, 0, 0],[0, 0, 0]]
#② Si le participant 1 répond correctement à la première question, inscrivez 1 dans l'élément correspondant.
[[1, 0, 0],[0, 0, 0],[0, 0, 0]] #1 dans le premier élément du tableau des premiers éléments
#③ Ensuite, si le participant 3 répond correctement à la deuxième question, inscrivez 1 dans l'élément correspondant.
[[1, 0, 0],[0, 0, 0],[0, 1, 0]] #1 dans le deuxième élément du troisième tableau d'éléments
ary = Array.new(3, Array.new(3, 0))
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]
Quant à l'apparence, j'ai fait ce que je veux faire, Quand j'essaye d'enregistrer la réponse
ary[0][0] = 1
print ary
# => [[1, 0, 0],[1, 0, 0],[1, 0, 0]]
J'avais l'intention d'apporter des modifications uniquement au premier tableau d'éléments, mais cela affectait tous les tableaux.
ary = Array.new(3).map{Array.new(3,0)}
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]
ary[0][0] = 1
print ary
# => [[1, 0, 0],[0, 0, 0],[0, 0, 0]]
En conséquence, en imbriquant la méthode cartographique, nous avons pu créer en toute sécurité un tableau comme imaginé.
Les tableaux bidimensionnels de (1) et (2) ci-dessus se ressemblent exactement, mais ils semblent avoir des propriétés complètement différentes. Je vais réfléchir à ce qui est différent.
Dans la Référence, il est écrit comme suit.
new(size = 0, val = nil) -> Array
Génère un tableau de taille de longueur, initialise chaque élément avec val et retourne. Notez que val n'est pas dupliqué élément par élément. Tous les éléments font référence au même objet val.
Exemple
ary = Array.new(3, "foo")
p ary #=> ["foo", "foo", "foo"]
ary[0].capitalize!
p ary #=> ["Foo", "Foo", "Foo"]
Dans cet exemple, le "foo" dans chaque élément est montré comme étant le même objet. Comme le dit la description, tous les éléments sont le même objet val.
Alors, le tableau bidimensionnel est-il créé dans ① l'image suivante?
Même si les éléments semblent être divisés en trois parties dans le tableau, ils ne font référence qu'au même objet à la fin. Il semble que quel que soit l'élément que vous modifiez, le même objet changera.
Est-ce une telle image?
Dans la Référence, il est écrit comme suit.
map -> Enumerator map {|item| ... } -> [object]
Renvoie un tableau contenant tous les résultats de l'évaluation des blocs pour chaque élément. Si vous omettez le bloc, effectuez l'itération décrite ci-dessus et Renvoie un objet Enumerator qui renvoie le tableau résultant.
Exemple
#Tout triple
p [1, 2, 3].map {|n| n * 3 } # => [3, 6, 9]
La méthode map, comme la méthode each, extrait les éléments de l'objet tableau un par un. Renvoie le résultat du traitement dans le bloc {} sous forme de tableau.
Alors, le tableau bidimensionnel créé dans (2) a-t-il l'image suivante?
Puisqu'un tableau est généré séparément pour chaque élément, chaque élément existe en tant qu'objet indépendant. Il semble donc que vous puissiez apporter des modifications séparément.
Jusqu'à présent, j'ai résumé les points sur lesquels je suis tombé sur la façon de créer un tableau à deux dimensions. J'ai l'intention de le résumer en lisant la référence etc. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.
Recommended Posts