Array im Array ohne Mengenangaben

kuhlmaehn

Erfahrenes Mitglied
Hi!
Sorry für den blöden Titel ;(

Ich habe mehere geometrische Figuren, welche aus unterschiedlich vielen Punkten bestehen.
Es sind auch immer unterschiedliche viele Figuren.
Diese Daten lese ich aus einer Textdatei aus und will sie dann in ein Array schreiben.
Die Koordinatenpunkte kann ich ja wunderbar in ein Array schreiben. Da ich ja mehere Figuren habe will ich auch für jede ein eigenes Array haben, nur weiss ich ja vorher nicht wieviele.
Also brauch ich irgendetwas wo ich, wenn die Textdatei geladen wird, die Daten reinschreibe.
Ich stelle mir das so vor:
Daten(1,1) gibt die erste Koordinate der ersten Figur aus. Daten (1,2) die 2. Koordinate usw.
Das Problem ist nur, dass ja jede Figur unterschiedlich viele Koordinaten hat. also würde zB das erste nur bis (1,5) gehen, das 2. jedoch bis (2,12).
Also, ich weiss vorher nicht wie viele Figuren und auch nicht wie viele Koordinaten jede der Figuren hat. Wie kann ich das am besten speichern?
Danke!
 
Hallo. ;)

Zum Problem mit der Arraygröße: Nimm eine dynamische Liste. ArrayList (System.Collections.ArrayList) oder besser eine generische List (System.Collections.Generic.List).

Wenn du jetzt eine Liste von Listen von Punkten haben willst, könnte das so aussehen:

C#:
using System.Collections.Generic;
using System.Drawing;
...
List<List<Point>> figures = new List<List<Point>>();

List<Point> fig1 = new List<Point>();
fig1.Add(new Point(10, 10));
fig1.Add(new Point(20, 20));

figures.Add(fig1);

Statt der Liste mit Punkten könntest auch einen GraphicsPath benutzen ;D - Oder eine eigene Klasse .. je nachdem was du brauchst..

lg,..
 
Danke :p
Mh, und wie kann ich dann dadrauf zugreifen? Nicht so schön übersichtlich wie wenn es ein Array wäre oder? :confused:
Ach Mensch das sind alles so viele neue Sachen das ich gar nicht vorankomme ;(
Vielleicht guck ich mir wirklich mal ganz genau den GraphicsPath an bevor ich irgendwas unnötiges einbaue ;)
Bei deinem Code versteh ich wieder mal gar nichts.. seit wann gibt es denn bei C# < und > !?
Achjah.. und ich dachte immer ich kann mir jede Programmiersprache schnell draufschaffen -.-
 
Zugriff erfolgt wie bei einem Array.. :)

C#:
List<Point> afigure = figures[0];
Point p1 = afigure[0];

Zu Generics hab ich dir gestern schon einen Link gegeben. Das Feature gibts, ich glaub ich habs auch schon erwähnt, seit C# 2.0. (.net 2.0, VisualStudio 2005 .. ;) )
 
Mh und wie kann ich dann unterscheiden um welche Figur es sich gerade handelt?
Es soll auch möglich sein zB zwei Figuren zu einer zu Verbinden indem ich bei jeder Figur eine Linie angebe und die Figuren dann an diesen Linien zusammengefügt werden (zB das aus zwei Quadraten ein Rechteck wird wird, oder aus zwei Dreicken ein Trapez oder eine Raute)
Dafür muss ich ja dann auch die Koordinaten neu anordnen oder? Und danach sollten die neuen Koordinaten bzw. die neue Figur dann auch anstelle der beiden in dem Array oder der Liste stehen.
Bei der Liste bzw. deinem Code ist mir irgendwie nicht klar wie ich das anstellen soll.
Ein Array finde ich irgendwie viel anschaulicher. :confused:
Ist die Liste oder der Grafikpath dafür wirklich geeignet? Ich hoffe nicht dann muss ich da nicht durchsteigen X(
 
Eine Liste ist nichts anderes als ein dynamisches Array.. da kannst ohne Probleme neue Punkte einfügen, ohne das du Stress mit der Arraygröße bekommst.

Beschäftige dich mal genauer mit den ganzen Sachen die bisher erwähnt wurden, und probier manche Sachen einfach mal aus..
 
Mh ok das klingt gut, dann muss ich mich da wohl oder übel mal vernünftig reinarbeiten =)
Vielen Dank bis hier :)
 
So, nach etlichem Lesen und Probieren später bin ich mir eigentlich sicher, dass das was ich gerne hätte nicht geht oder ich es (mal wieder) nicht verstanden habe. :)

Die Liste ist erstmal super für mein Vorhaben. Mein Problem ist nur nachwievor, dass ich gerne für jede Figur eine eigene Liste hätte, aber vorm Programmstart nicht weiss wie viele.
Ich dachte jetzt an sowas:
C#:
List<int>[] bla = new List<int>()[2];

            bla[0].Add(1);
            bla[0].Add(2);
            bla[0].Add(3);

            bla[1].Add(1);
            bla[1].Add(2);
            bla[1].Add(3);
Was natürlich nicht geklappt hat :p

Gibt es denn irgendeine Möglichkeit das so zu machen?
Danke!

[Edit]
Ok ich löse das jetzt mit einer temporären Liste wo ich was zwischenspeichere. Das müsste auch gehen.
Es würde mich aber immernoch interessieren ob das von oben funktioniert :)
 
Zuletzt bearbeitet:
Eine Möglichkeit wäre folgende


C#:
ArrayList arrList = new ArrayList();

ArrayList.Add(new List<int>());
ArrayList.Add(new List<int>());

ArrayList[0]).Add(1);
ArrayList[0]).Add(2);
ArrayList[0]).Add(3);

ArrayList[1].Add(1);
ArrayList[1].Add(2);
ArrayList[1].Add(3);

/* Inhalt des Arrays:

1 2 3 
1 2 3


Der Zugriff geht dann wie folgt
*/

((List<int>)ArrayList[0])[0] = 11;
((List<int>)ArrayList[1])[0] = 111;

/* Inhalt des Arrays:

11 2 3
111 2 3
*/
 
Zurück