Ben2013 Geschrieben 3. April 2013 Geschrieben 3. April 2013 Wie realisiere ich ein wachsendes Array? Ich probiere schon seid Tagen mit den Klassen Arrays, LinkedList, ArrayList und natürlich normalen Arrays herum. Ziel: -double[n] [2] n=0: -wenn XYZ erfüllt ist, "hänge" eine neue zeile an double[1] [2] n=1: -wenn XYZ erfüllt ist, "hänge" eine neue zeile an double[2] [2] n=2: -wenn XYZ erfüllt ist, "hänge" eine neue zeile an double[3] [2] n=n: -wenn XYZ erfüllt ist, "hänge" eine neue zeile an double[n+1] [2] Zitieren
Ben2013 Geschrieben 3. April 2013 Autor Geschrieben 3. April 2013 nein gibt es dafür in irgendeiner klasse eine Methode? Zitieren
lilith2k3 Geschrieben 3. April 2013 Geschrieben 3. April 2013 Ich weiß ja nicht, was Du so wirklich vor hast - es sieht mehr nach homöpathischen Programmierexperimenten aus. Aber nur einmal zu dem von Dir Erdachten: Angenommen Du möchtest eine Klasse schreiben, die sich wie ein dynamisches Array verhält, ist es wenig sinnvoll eine Strategie zu verfolgen, wo Du einfach ein Element hintendranhängst, also quasi ein neues Array generierst, was genau n+1 Elemente fassen kann. Sinnvollerweise könntest Du eine Klasse schreiben, die ein Array beinhaltet und wenn dessen Kapazität erschöpft ist, ein neues Array benutzt, was 2n Elemente beherbergen kann. Was aber hindert Dich daran, einfach einen Container wie (Array-)List zu benutzen? Zitieren
Joey P Geschrieben 4. April 2013 Geschrieben 4. April 2013 Ein stink normales Array wachsen zu lassen geht nicht. Wenn du nicht ArrayList oder ähnliches benutzen willst schreibst du dir einfach ne Methode, welche ein neues Array erzeugt welches um x Elemente größer ist als das vorhandene schreibst die Einträge aus dem alten ins neue und überschreibt das alte Array mit dem neuen Zitieren
Gast runtimeterror Geschrieben 4. April 2013 Geschrieben 4. April 2013 Oder er nimmt wie schon vorgeschlagen einfach ArrayList<Zeile> - was exakt dasselbe macht. Aber irgendein Grund wird vermutlich wieder dagegen sprechen. z. B., dass man nicht mit 500 Threads gleichzeitig auf eine ArrayList zugreifen kann, ohne diese zu synchronisieren. ;P Zitieren
Ben2013 Geschrieben 5. April 2013 Autor Geschrieben 5. April 2013 Es war schon wichtig, dass das Array genau die Größe hat, sodass es ganz gefüllt ist. Aber ich hab das Problem anders gelöst. (Vorheriges Bestimmen der Arraygröße) (nicht lachen Das war von Anfang an der Quellcode, der aber ab und zu ArrayIndexOutOfBounds Exceptions geworfen hab.) Und da hätte ich gleich noch eine Frage: Wie kann das passieren? sieht ungefähr so aus: int lTest = 0; for(alle zahlen überprüfen) { if(gerade zahl) { lTest++; } } erstelle array der größe lTest for(alle zahlen überprüfen) { if(gerade zahl) { greife auf das Array zu } } das wirf gelegentlich die Exception umgehbar mit try-catch-block und while schleife außenrum gelegt. Also rein mathematisch kann keine Exception auftreten. Und bei wiederholtem rechnen tritt auch keine mehr auf. Frage: Ist das normal? Wie oft tritt das in der Praxis/Realität auf? Zitieren
flashpixx Geschrieben 5. April 2013 Geschrieben 5. April 2013 (bearbeitet) das wirf gelegentlich die Exception umgehbar mit try-catch-block und while schleife außenrum gelegt. Also rein mathematisch kann keine Exception auftreten. Und bei wiederholtem rechnen tritt auch keine mehr auf. Frage: Ist das normal? Wie oft tritt das in der Praxis/Realität auf? Wie auch schon in Deinen anderen Thread angemerkt, zeige Deinen realen Code, dann kann man dazu auch was sagen. Dein Pseudocode ist absolut unbrauchbar, um das Problem zu verdeutlichen. Ebenso solltest Du Dir angewöhnen, dass Du auch die entsprechenden Meldungen angibst, die Dein Code produziert. Ich gehe davon aus, dass Dein Code mehrere semantische Fehler enthält, die durch Deine exzessive Nutzung von mehreren 100 Threads noch die Probleme durch die Nebenläufigkeit verstärken. Ändere Deinen Code so ab, dass er das Problem sinnvoll mit resourcenschonenden Strukturen löst. Du kannst hier Hilfe bekommen, aber Du musst schon dazu Deinen Code und auch die genaue Problemstellung und vor allem das Ziel angeben. Das Problem wird nicht an Java oder Deinem Rechner liegen, das Problem ist Deine Programmierung. Deine Postings beschreiben bisher im Grunde die Aussage "mein Code läuft nicht, aber ich will den nicht zeigen und den Algorithmus will ich auch nicht überarbeiten" Bearbeitet 5. April 2013 von flashpixx Zitieren
Ben2013 Geschrieben 5. April 2013 Autor Geschrieben 5. April 2013 Ebenso solltest Du Dir angewöhnen, dass Du auch die entsprechenden Meldungen angibst, die Dein Code produziert. ArrayIndexOutOfBounds Exceptions ------------------------------------------------------------------------------------------------ Ich gehe davon aus, dass Dein Code mehrere semantische Fehler enthält umgehbar mit try-catch-block und while schleife außenrum gelegt. boolean lFehler = true; int Ergebnis1 = 0; int Ergebnis2 = 0; int [] lArray; while(lFehler) { try { lFehler = false; lErgebnis1 = 2+3; lArray = new int [lErgebnis1]; lErgebnis2 = 2+3; lArray[lErgebnis2] = 37; // hier tritt ab und zu eine ArrayIndexOutOfBounds Exception auf } catch(Exception e) { lFehler = true; } } mit while schleife und try-catch-block funktioniert ales. -> ab und zu wird 2+3 anders berechnet --> und dann wieder nicht Zitieren
flashpixx Geschrieben 5. April 2013 Geschrieben 5. April 2013 Try-Catch löst das Problem nicht, sondern es fängt lediglich den Fehler ab, wie Du ihn behandelst ist eben dann Deine Sache und eine Index-Out-of-Bounce Exception sagt, dass Du auf ein Element zugreifst, dass nicht existiert. Zu Deinem Code, Du allokierst so lange lFehler true ist immer ein neues Array, obwohl sich die Daten des Arrays nicht ändern, d.h. jedes Mal wird Speicher allokiert und ggf erst später durch den GC freigegeben, das ist absolut sinnfrei. Zweitens wird eine Exception hier jedes Mal auftreten, denn Du greifst auf das 5. Element zu, aber die Indizierung eines Arrays beginnt bei null, also ist der Index den Du verwendest generell falsch. Zitieren
Gast runtimeterror Geschrieben 5. April 2013 Geschrieben 5. April 2013 (bearbeitet) Erstmal höchsten Respekt an alle Helfer, die bislang nicht die Nerven verloren haben! Es war schon wichtig, dass das Array genau die Größe hat, sodass es ganz gefüllt ist. Zum einen ist das mit ziemlicher Sicherheit Quatsch. Es hindert dich keiner daran die Größe als separate Variable mitzuführen, diese mit einem Buffer nachträglich zu begrenzen oder eine größenkorrigierte Kopie an eine externe API zu geben. Zum Anderen: warum schreibst du das nicht im Eingangsposting?? Wieso müssen wir immer die Anforderung raten? Alle Naslang schüttest du deinen Pseudocode-Müll ins Forum und während wir noch mit Handschuhen und Schutzanzug versuchen herauszufinden warum das so stinkt, hängst du noch ein paar Duftbäumchen dran und bist zufrieden! mit while schleife und try-catch-block funktioniert ales. -> ab und zu wird 2+3 anders berechnet --> und dann wieder nicht Dein Code kompiliert aus offensichtlichen Gründen nicht. Und das - oh Wunder - sogar reproduzierbar! lArray[lErgebnis2] = 37; // hier tritt ab und zu eine ArrayIndexOutOfBounds Exception auf Ein Zugriff auf dasselbe Array mit demselben Index wird immer funktionieren oder immer fehlschlagen, Punkt! In deinem Fall wird sie immer fehlschlagen. Warum ignorierst du sämtliche guten Tipps, die du erhältst? Dir mag die Wahrheit nicht gefallen, aber Java verhält sich exakt so, wie du es ihm sagst! Wenn ein Fehler rauskommt, dann hast du etwas falsch gemacht. Java sagt dir sogar, was du falsch gemacht hast. Sag uns was du vorhast (alle Randbedingungen!) Sag uns was du versucht hast (echter Code, an dem man das Problem nachvollziehen kann) Sag uns was passiert ist (Fehlermeldung (nicht deine sinngemäße Interpretation), Ergebnis) Sag uns was du erwartet hast Und ich bin mir sicher, dass wir dir in Null-Komma-Nix ein paar hilfreiche Ratschläge anbieten können. ... und komm nicht nach 10 Minuten um die Ecke um den Leuten zu sage, dass sie sich die Mühe hätten sparen können, weil du eh kein Interesse an anderen Meinungen und Lösungsvorschlägen hast oder das Problem selbst in der kurzen Zeit gelöst hast (was darauf schließen lässt, dass du dich zuvor gar nicht ernsthaft mit dem Problem befasst hast) ... dass man das überhaupt noch erklären muss ... wieder 15 Minuten verschwendet ... Bearbeitet 5. April 2013 von runtimeterror Zitieren
Joey P Geschrieben 6. April 2013 Geschrieben 6. April 2013 ------------------------------------------------------------------------------------------------ while(lFehler) { try { lFehler = false; lErgebnis1 = 2+3; lArray = new int [lErgebnis1]; lErgebnis2 = 2+3; lArray[lErgebnis2] = 37; // hier ist auch der fehler Du erzeugst ein Array mit 5 Elementen (0, 1, 2, 3, 4) und greifst aber dann auf IArray[5] zu welches das 6. Element wäre welches nicht existiert (so groß ist das Array nicht) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.