Kann man mit einer Schleife mehrere Objekte gleichzeitig erzeugen in Java?

3 Antworten

Gleichzeitig nur mit Ansynchronität, also mehreren Threads (wobei das auch nicht zwingend "gleichzeitig" sein muss). Aber du kannst so viele Objekte erzeugen, wie du willst, auch in einer Schleife.
Naja, bis du dann den OutOfMemoryError kriegst. Aber das sollte wohl kaum passieren, außer du legst es darauf an.


leclerc16 
Fragesteller
 27.06.2018, 14:18

Wie kann ich es machen, dass die Vokabelobjekte mit den Begriffen im Array erzeugt werden. So wie ich das gemacht habe, zeigt er einen Fehler an

        String array [] = new String [5];
        array[0] = "Brot";
        array[1] = "Milch";
        array[2] = "Kaffee";
        array[3] = "Ente";
        array[4] = "Ballon";
        
        
        
        for(int i = 0; i<array.length; i++)
        {
            Vokabel array[i] = new Vokabel ();      
        }
1
NoHumanBeing  27.06.2018, 14:41
@leclerc16

Zunächst heißt es ...

String[] array = new String[5];

Dann ist array vom Typ String[], jedes Element in array (z. B. array[0]) ist damit vom Typ String (also das selbe, nur ohne die Arrayklammern).

Einer Variablen vom Typ String kannst Du keine Variable vom Typ Vokabel zuweisen. Du müsstest dann das Array per ...

Vokabel[] array = new Vokabel[5];

... deklarieren und initialisieren. Dann kannst Du jedem Element einen Wert vom Typ Vokabel zuweisen.

1
verreisterNutzer  27.06.2018, 14:40

Was für einen Fehler zeigt "er" an?

AAber in deinem Codefragment sind mehrere Fehler.

(1) array ist schon als String-array definiert

(2) der Typ Vokabel ist nicht definiert

wenn Vokabel definiert wäre, müsste es heissen

Vokabel vokobject = new Vokabel();

den Namen vokobject müsstest du halt in der Schleife immer neu (eindeutig) erzeugen, damit du i unterscheidbare vokobjecte bekommst, z. B. vocobject + chr$(i) (nur Pseudocode, wie die echte Erzeugung aussieht liegt an der Java-Syntax)

1
verreisterNutzer  27.06.2018, 20:16
@leclerc16

Ach so, jetzt verstehe ich dein array[i].

Sowas versuchte ich früher auch, weis aber nicht mehr wie das ging.

Auf jeden Fall kannst du nicht direkt array[i] nehmen, musst irgendeinen Umweg nemen mit String Name = array[i].

Aber Name ist dann immer noch eine Variable und kein Objektname.

2
leclerc16 
Fragesteller
 27.06.2018, 20:31
@verreisterNutzer

Ok danke, du bist der einzige, der mich verstanden hat von 20 Antworten. Werde ich probieren.

1
verreisterNutzer  27.06.2018, 20:36
@leclerc16

Ich weis aber nur, dass das so nicht klappt -- kann mich aber dunkel erinnern, dass es in java eine (eingebaute) Funktion gibt, die aus dem Inhalt der Variablen Name (oder array[i]) einen Objektnamen erzeugt.

Also du musst etwas finden, was aus dem Inhalt von array[i] einen Bezeichner (so der offizielle Begriff) macht.

1
verreisterNutzer  27.06.2018, 20:43
@leclerc16

Habe ich versucht dir in meinem letzten Kommantar mitzuteilen -- der Inhalt einer Variablen ist noch kein Bezeichner -- suche mal in diversen Java-Foren nach z.B. "Inhalt Stringvariable zu Bezeichner konvertieren"

1
NoHumanBeing  27.06.2018, 21:32
@leclerc16

Zu Deinem Screenshot:

Erstmal muss der Einsprungpunkt deklariert werden als ...

public static void main (String[] args) {
  ...
}

... main, nicht man.

Der Konstruktor Deiner Vokabel-Klasse benötigt die Vokabeln in italienisch und englisch, also musst Du diese Daten natürlich auch irgendwo haben. Ich kann leider kein italienisch, also schreibe ich in das "italienische" Array hier einfach mal die deutschen Wörter.

int n = 5;

/*
 * Die Arrayklammern kommen hinter den Datentyp,
 * nicht hinter den Variablennamen!
 *
 * Die Variable italienisch ist vom Typ String[]
 * (Array aus Strings).
 */
String[] italienisch = new String[n];
italienisch[0] = "Brot";
italienisch[1] = "Milch";
italienisch[2] = "Kaffee";
italienisch[3] = "Ente";
italienisch[4] = "Ballon";

String[] englisch = new String[n];
englisch[0] = "bread";
englisch[1] = "milk";
englisch[2] = "coffee";
englisch[3] = "duck";
englisch[4] = "balloon";

Vokabel[] vokabeln = new Vokabel[n];

/*
 * Nun das neue Array mit den Vokabeln füllen.
 *
 * Anstatt mit "n" könnte man hier natürlich auch mit
 * "vokabeln.length" vergleichen.
 */
for (int i = 0; i < n; i++) {
  String it = italienisch[i];
  String en = englisch[i];
  vokabeln[i] = new Vokabel(it, en);
}
0

Indem du die Objekte in der Schleife erzeugst.

Wo liegt das Problem?

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

leclerc16 
Fragesteller
 27.06.2018, 13:56

Stimmt, ist eigentlich ganz einfach, hab nicht so weit gedacht. Danke

1
Object[] arr = new Object[5];

for (int i = 0; i < arr.length; i++)
   arr[i] = new Object();

leclerc16 
Fragesteller
 27.06.2018, 15:37

Ich wollte die Objekte selbst nicht in ein Array packen, das hätte ich in einem zweiten Schritt getan. Sondern sie zunächst nur erzeugen und mit den Wörtern, die sich im Array befinden, bennen. Also ein Objekt soll "Ballon" heißen, ein anderes "Kaffe" usw.

In den Objekteigenschaften würde ich dann jeweils eine italienische und eine englische Übersetzung eintragen, weil ich diese beiden Sprachen gleichzeitig lernen möchte.

1
NoHumanBeing  27.06.2018, 21:23
@leclerc16

Nunja, irgendwo musst Du sie speichern.

Wenn Du zunächst nicht weißt, wie viele Werte es werden, kannst Du z. B. auch eine verkettete Liste (in Deinem Fall also java.util.LinkedList<Vokabel>) verwenden.

Nachdem Du alle Objekte (per .add(...) oder .addLast(...))eingefügt hast, kannst Du Dir zunächst über die Methode .size() die Anzahl der Elemente (als int) holen. Dann allozierst Du ein entsprechend großes Array und nutzt die Methode .toArray(T[] a), um das ganze in ein Array zu überführen.

Beispiel:

java.util.LinkedList<Vokabel> vokabeln = new java.util.LinkedList<Vokabel>();

for (int i = 0; i < 5; i++) {
   /* Hier die Liste befüllen. */
   Vokabel vokabel = new Vokabel();
   vokabeln.addLast(vokabel);
}

int numVokabeln = vokabeln.size();
Vokabel[] vokabelArray = new Vokabel[numVokabeln];
vokabeln.toArray(vokabelArray);

/* Ab hier kannst Du mit vokabelArray arbeiten. */
0
leclerc16 
Fragesteller
 27.06.2018, 21:19

du gibst mir einen Daumen hoch, aber keine Antwort...

1
NoHumanBeing  27.06.2018, 21:33
@leclerc16

Ich gebe den Daumen, sobald ich den Beitrag gelesen habe.

Antwort schreiben dauert ein bisschen. ;-)

0