Divu dimensiju masīvu izveidošana rubīnā

click fraud protection

Šis raksts ir daļa no sērijas. Plašākus šīs sērijas rakstus skatiet filmas 204 klonēšana Rubīnā. Pilnīgu un galīgu kodu skat. Saturā.

Tagad, kad mēs zinām, kā algoritms darbosies, ir pienācis laiks padomāt par datiem, uz kuriem šis algoritms darbosies. Šeit ir divas galvenās izvēles: dzīvoklis masīvs sava veida vai divdimensiju masīvs. Katram no tiem ir savas priekšrocības, taču pirms lēmuma pieņemšanas mums kaut kas jāņem vērā.

SAUSAS mīklas

Izplatīts paņēmiens darbā ar režģa mīklām, kurās jāmeklē šādi paraugi: rakstīt algoritma versija, kas darbojas ar mīklu no kreisās uz labo pusi un pēc tam visu mīklu pagriež ap četriem reizes. Tādā veidā algoritms ir jāraksta tikai vienu reizi, un tam jāstrādā tikai no kreisās uz labo pusi. Šis dramatiski samazina sarežģītību un lielumu no šī projekta vissmagākās daļas.

Tā kā mēs strādāsim ar mīklu no kreisās uz labo pusi, ir jēga, ja rindas attēlo masīvi. Veicot divdimensiju masīvu Rubīns (vai precīzāk, kā vēlaties to risināt un ko patiesībā nozīmē dati), jums jāizlemj, vai vēlaties rindu kaudze (kur katru režģa rindu attēlo masīvs) vai kolonnu kaudze (kur katra kolonna ir masīvs). Tā kā mēs strādājam ar rindām, mēs izvēlamies rindas.

instagram viewer

Kā tiek pagriezts šis 2D masīvs, mēs nokļūsim pēc tam, kad būsim faktiski izveidojuši šādu masīvu.

Divu dimensiju masīvu izveidošana

Metode Array.new var izmantot argumentu, kas nosaka vajadzīgā masīva lielumu. Piemēram, Masīvs.jauns (5) izveidos 5 nulles objektu masīvu. Otrais arguments dod jums noklusējuma vērtību, tāpēc Masīvs.jauns (5, 0) dos jums masīvu [0,0,0,0,0]. Tātad, kā izveidot divdimensiju masīvu?

Nepareizs ceļš, un tas, kā es redzu cilvēkus cenšamies bieži pateikt Array.new (4, Array.new (4, 0)). Citiem vārdiem sakot, 4 rindu masīvs, katra rinda ir 4 nulles masīvs. Un šķiet, ka tas sākotnēji darbojas. Tomēr palaidiet šo kodu:

Tas izskatās vienkārši. Izveidojiet 4x4 nulles masīvu, iestatiet elementa augšējo kreiso pusi uz 1. Bet izdrukājiet un mēs saņemam…

Tajā visa pirmā kolonna tika iestatīta uz 1, kas dod? Kad mēs izveidojām blokus, vispirms tiek izsaukts iekšējais zvans uz Array.new, veidojot vienu rindu. Pēc tam 4 reizes tiek kopēta viena atsauce uz šo rindu, lai aizpildītu ārējo masīvu. Pēc tam katra rinda atsaucas uz to pašu masīvu. Mainiet vienu, mainiet tos visus.

Tā vietā mums jāizmanto trešais veids, kā izveidot masīvu Ruby. Tā vietā, lai pārsūtītu vērtību Array.new metodei, mēs nododam bloku. Bloks tiek izpildīts katru reizi, kad Array.new metodei ir nepieciešama jauna vērtība. Tātad, ja jūs teiktu Array.new (5) {gets.chomp}, Rubīns apstāsies un piecas reizes lūgs ievadi. Tātad viss, kas mums jādara, ir tikai izveidot jaunu bloku šajā blokā. Tātad mēs galu galā ar Array.new (4) {Array.new (4,0)}. Tagad mēģināsim vēlreiz šo testa gadījumu.

Un tas notiek tieši tā, kā jūs varētu gaidīt.

Tātad, kaut arī Rubīnam nav divdimensiju masīvu atbalsta, mēs joprojām varam darīt to, kas mums vajadzīgs. Tikai atceraties, ka augšējā līmeņa masīvs ir pieejams atsauces apakšmasīviem, un katram apakšmasīvam būtu jāatsaucas uz atšķirīgu vērtību masīvu.

Tas, ko šis masīvs attēlo, ir atkarīgs no jums. Mūsu gadījumā šis masīvs ir izkārtots kā rindas. Pirmais indekss ir rinda, kuru mēs indeksējam, no augšas uz leju. Lai indeksētu puzles augšējo rindu, mēs izmantojam a [0], lai indeksētu nākamo rindu, kuru izmantojam a [1]. Lai indeksētu konkrētu flīzi otrajā rindā, mēs izmantojam a [1] [n]. Tomēr, ja mēs būtu izlēmuši par kolonnām… tas būtu tas pats. Rubīnam nav ne mazākās nojausmas, ko mēs darām ar šiem datiem, un, tā kā tas tehniski neatbalsta divdimensiju masīvus, tas, ko mēs šeit darām, ir hack. Piekļūstiet tam tikai pēc vienošanās, un viss turēsies kopā. Aizmirstiet zemāk esošos datus, un viss var ātri sabrukt.

instagram story viewer