Skip to content
Tags

,

Array mit einer Schleife füllen…

Dezember 31, 2013

Vor einiger Zeit hatte bin ich neben dem klassischen Füllen eines 2D-Arrays mit

for(y = 0; y < lengthY; y++)
{
  for(x = 0; x < lengthX; x++)
  {
     array[y,x] = [...];
  }
}

einmal über folgende Lösung gestolpert

for(index = 0; index < numberOfElements; index++)
{
   array[index / numberOfColumns, index % numberOfColumns] = [...];
}

Irgendwie ging mir das Ding nicht aus dem Kopf… und hab‘ mir überlegt, ob das Konstrukt auch n-dimensionale Arrays mit einer Schleife füllen kann.

Nach etwas Grübelei und Gecode in C# kam bei 4 Dimensionen folgendes heraus…

var numberOfColumns = 2;
var numberofRows = 2;
var numberOfPlanes = 2;
var numberOfCuboids = 2;
 
var sizeOfRow = numberOfColumns;
var sizeOfPlane = numberofRows * numberOfColumns;
var sizeOfCuboid = sizeOfPlane * numberOfPlanes;
var totalIndexes = sizeOfCuboid * numberOfCuboids;
 
var array = new int[
  numberOfCuboids,
  numberOfPlanes,
  numberofRows,
  numberOfColumns
];
 
for (var index = 0; index < totalIndexes; index++) {
  var a = index % sizeOfRow / 1;
  var b = index % sizeOfPlane / sizeOfRow;
  var c = index % sizeOfCuboid / sizeOfPlane;
  var d = index % totalIndexes / sizeOfCuboid;
  
  array[d, c, b, a] = index;
}

Das Muster ist einigermassen erkennbar:

Der Index einer Dimension errechnet sich aus dem fortlaufenden Index Modulo der Anzahl der Elemente einer Dimension durch die Ganzzahldivision der Anzahl der Elemente der „vorhergehenden“ Dimension.

Wenn jemandem eine besser Definition einfällt, her damit 🙂

Problem ist aber, dass die Anzahl der Dimensionen hartcodiert vorliegt…

Nach einigem Refactoring kam diese Lösung heraus, die ein Array beliebiger Größe füllen kann. Was rein kommt, kann durch eine Funktion geregelt werden.

Das ganze Ding ist zwar noch nicht optimal, aber es erfüllt seinen Zweck… es hat mich mal wieder zum „sinnlosen“ Coden gebracht.

Advertisements

From → Uncategorized

Schreibe einen Kommentar

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: