Zum Inhalt springen

Wachsendes Array realisieren?


Empfohlene Beiträge

Geschrieben

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]

Geschrieben

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?

Geschrieben

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

Gast runtimeterror
Geschrieben

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

Geschrieben

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?

Geschrieben (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 von flashpixx
Geschrieben
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

Geschrieben

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.

Gast runtimeterror
Geschrieben (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 von runtimeterror
Geschrieben
------------------------------------------------------------------------------------------------


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)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...