Laden...

Fragen zur ArrayList

Erstellt von Schwabbel vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.957 Views
S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren
Fragen zur ArrayList

Also ich hab hier eine Klasse Dreieck mit der Klasse wird aus drei Werten (Punkte : A,B,C) ein dreieck erzeugt

nun soll ich dieses Dreieck Speichern (mehrere Dreiecke sollen gespeichert werden ) und das alles mit der ArrayList

hab jetzt mal so angefangen

public Dreieck DreiE;
		   ArrayList A = new ArrayList();
           
		   ArrayList B = new ArrayList();

           ArrayList B = new ArrayList();

Meine Frage wie bekomme ich jetzt die werte eingefügt

Ein Dreieck (f) kann aus der Klasse die werte f.A,f.B,f.C wiedergeben .

Danke schonmal für eure Vorschläge

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

warum drei ArrayListen? Du brauchst doch nur eine. Mit


ArrayList alDreicke = new ArrayList ();

hast du eine ArrayList und mit


alDreiecke (new Dreieck ());

hast du ein Dreieck hinzugefügt. Auf dieses Dreieck kannst du z.B. mit


Dreieck dreck = (Dreieck)alDreiecke [0];

zugreifen.

Wenn du .NET 2.0 hast, ist es jedoch bessser List <Dreieck> zu verwenden.

herbivore

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

Ähm eigentlich dachte ich das eine ArrayList eindimensional ist sprich nur einen Wert annehmen kann und ein dreieck besteht aus sechs f.A.x,f.A.y,usw.
kann aber seindas ich da falsch liege ich probier das mal danke

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

ArrayList ist eindimesional, kann aber beliebige Objekte aufnehmen (hier: Dreicke). Wie die Objekte selbst aufgebaut sind, ist der ArrayList egal.

herbivore

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

irgendwie Funktioniert das nicht so

ich Versuche es nochmal zu beschreiben

habe eine Form wo ein dreick anhad der Seitenlängen erzeugt wird und dann unter der Kalsse Dreieck eingefügt wird (dort berechnet er winkel,seitenlängen usw)

habe Die Klasse Dreieck wo es ein dreieck mit f.(...) gibt

habe eine Klasse DreiKon wo dieses Dreieck gespeichert werden soll mit einer ArrayList in dem Feld (DreiE)

public class DreiKon
	{
		public DreiKon()
		{
			// 
			// TODO: Fügen Sie hier die Konstruktorlogik 
			//
		}

		public Dreieck DreiE;


Jetzt muss ich doch als Konstruktor

public class DreiKon
	{
	public DreiKon()
	{
                 System.Collection.ArrayList aldreieck = new                                     System.Collection.ArrayList       

                          		
}

		public Dreieck DreiE;

dan hab ich die Arraylist erzeugt und nun will ich aus der Form ein Dreick hinzufügen

also in der Form z.B. unter einem Button

und diesen dan unter dem Feld DreiE abrufen unter einem anderen Button mit dem index

A
154 Beiträge seit 2005
vor 18 Jahren

Irgendwie kommt dein Problem nicht ganz rüber.
In deiner Klasse DreiKon müßtest du noch Methoden zum hinzufügen und löschen von Dreiecke verpassen. Oder halt passende Operatoren überladen.

Im Prinzip könntest du 3 Klassen bauen.
Eine Klasse Dreick welche die Punkte speichert.
Eine Klasse DreieckCollection (denke mal das soll die DreiKon bei dir machen) welche 3Ecke speichert. Diese könntest du auch von "CollectionBase" ableiten. Das macht das ganze einfacher.
Eine Klasse welche Rechenoperationen für 3Eck Klassen bereitstellt.

.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

mir ist das Problem auch nicht ganz klar geworden. Aber den Vorschlag von dir, AlfameisterT, halte ich für ungünstig. Zum einen gehören Daten (hier: die Eckpunkte) und die Operationen auf jeden Fall in eine Klasse! Das ist ja gerade das Grundkonzept der Objektorientierung (die Daten werden durch die Operationen gekapselt). Und eine extra Collection-Klasse braucht man hier m.E. nicht, weil ArrayList schon alles tut, was man braucht.

Bleibt das GUI. Es spricht nichts dagegen die ArrayList - die momentan eine lokale Variable ist - zu einer Instanzvariable zu machen, damit man in den verschiedenen Methoden des Fensters (ButtonClick u.ä.) darauf zugereifen kann. Der Sinn der Instanzvariable DreiE erschließt sich mir dagegen nicht. Wenn die Dreiecke in der ArrayList gespeichert werden, braucht man so eine Variable nicht oder nur als lokale Variable, um bequemer mit einem bestimmten Dreieck arbeiten zu können.

herbivore

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

So hab das jetzt verstanden hab da nun nur wieder ein problem

ArrayList  ald = new ArrayList();

das Funktioniert und damit erstellt er ja die Arraylist

Dann

ald (new Dreieck(a,b,c));

da gibt er mir den Fehler

(1286): 'WindowsApplication1.Form1.ald' deutet auf 'Feld' hin, wo 'Klasse' erwartet wurde

Warum ??

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo

es fehlt ein .Add:


ald.Add (new Dreieck(a,b,c));

Syntaxfehler sind in der Regel leicht zu beheben, zumal die Fehler und deren Lösungen in der SDK-Doku gut - in der Regel mit Beispielen - beschrieben sind.

herbivore

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

ja das hab ich auch schon probiert aber dann kommt der fehler auch nicht mehr

aber dann kann ich es nicht wieder abrufen

spricht

f = ald [index]

sagt er mit das das objekt nicht zum typ dreieck konvertiert werden kann
obwohl es ja dann vom typ dreieck ist

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

auch das ist ein Syntaxfehler und es ist so wie der Compiler sagt, worauf man sich übrigens eigentlich immer verlassen kann.

ArrayList speichert Objekte vom Typ Object. Was anderes wäre auch wundersam, denn woher hätten die .NET-Entwickler was von deiner Dreiecksklasse wissen sollen 🙂

Das ist so, auch wenn du in deinem konkreten Fall Dreiecke reintust. Ein Dreieck einer Object-Variable zuweisen geht, deshalb ist das Reintun kein Problem. Aber ein Object vom statischen Typ Object einer Dreieck-Variablen zuweisen geht nicht ohne Cast.

f = (Dreieck)ald [index];

Deshalb ist die Verwendung von List <Dreieck> auch vorzuziehen, den diese Liste speichert dann wirklich Dreiecke.

herbivore

PS: Die Fehlermeldung sagt ja auch nur, dass er nicht implizit konvertieren kann, nicht das die Konvertierung gar nicht geht.

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

So ok das hab ich verstanden es läuft jetzt auch wunderbar

er Speichert die Dreiecke auch ohne Problem ( hab ein lable gemacht wo er die Count Eigenschaft als zahlenwert wiedergibt) die steigt auch nach jedem Speichern.

Jetzt gibt er mir aber immer das zu letz erzeugte dreieck wieder und immer nur das letzte auch wenn ich im code den indexer direkt setzte

DreiKon l  = (DreiKon)ald[Int32.Parse(load.Text)];

so wollte ich es machen das man die Zahl des indexers per textfeld festlegen kann

🙁 zu deinem Vorschlag mit der Liste ich muss es leider mit Der Arraylist machen

Speichern sieht so aus

public System.Collections.ArrayList ald = new System.Collections.ArrayList ();
  ald.Add (new DreiKon(f,Wahl.Text));	

und laden so

DreiKon l  = (DreiKon)ald[Int32.Parse(load.Text)];
			Dreieck f = l.DreiE;
			Wahl.Text =  l.Kons;
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

wenn du schreibst

DreiKon l = (DreiKon)ald[5];

dann erhältst du das sechse Object aus der ArrayList. Da gibt es auch nichts falsch zumachen.

Entweder du vertust dich später mit den Variablen, also dass du z.B. später nicht l benutzt oder l wird vor der Verwendung noch verändert oder in dem Array sind mehrmals dieselben Objekte gespeichert.

herbivore

PS: Ich habe gerade deine Überarbeitung gesehen. Du hast vermutlich nur ein Dreieck erstellt (new), so das du in allen DreiKon dasselbe Dreieck benutzt, dass dann natürlich immer mit den letzten Werten überschrieben wird.

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

Das in der PS versteh ich jetzt nicht ganz

also das ist meine dreikon

public DreiKon(Dreieck f , String g)
		{
			f=DreiE;
			Kons=g;
		}

		public Dreieck DreiE;
		
		public string Kons;

Das ist nur ne zusammenfassung der beiden Werte (Dreieck und Dem string)

dann hab ich 4 verschiedene berechnungen nach denen sich das dreieck f ändert.

also hab ich eigentlich einen unterschied wenn ich auf save drücke (oder?)

Oder ändert sich die dreikon nicht wenn ich ein neues f habe und dann

ald.add (new Dreikon(f,string))

Was mir grade aufgefallen ist ist das sich der String ändert

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

in Konstruktor war schonmal ein Fehler:


public DreiKon(Dreieck f , String g)
{
   DreiE = f;  // <= hier
   Kons=g;
}

Aber du musst dem Konstuktor auch immer schön ein neues Dreieck mitgeben, also z.B.


ald.Add (new DreiKon (new Dreieck (A, B, C), Wahl.Text));

Wenn du immer dasselbe Dreieck-Objekt übergibst, teilen sich alle DreiKons dieses eine Objekt, was zu dem von dir beschriebenen Effekt führt.

herbivore

S
Schwabbel Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

ah jetzt verstehe ich

hab ich ein dreieck f in die DreiKon eingefügt und sage dann beim zweiten mal übernehme wieder Dreieck f dann ändert er nichts weil das erste auch schon f heißt

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Schwabbel,

nicht ganz. Erstmal ist der Name der Variablen egal, man kann auch fünf Variablen haben und nur ein Objekt. Und das ist gerade dein Problem. Mal ein Beispiel:

Dreieck f = new Dreieck (1, 2, 3);
Dreieck g = f;
Dreieck h = f;

Drei Variablen, ein Objekt. Alle drei Variablen verweisen auf dasselbe Objekt. Wenn ich jetzt z.B.

f.A = 5;

schreibe (vorausgesetzt die Klasse erlaubt das), dann ist auch g.A == 5 und h.A == 5, weil eben das eine vorhandene Objekt geändert wurde und ich über g und h auch nur auf dieses eine Objekt zugreife.

Bei dir teilen sich eben alle DreiKon dasselbe Dreieck-Objekt.

herbivore