Probleme mit ArrayList

Status
Nicht offen für weitere Antworten.

andreas2505

Bekanntes Mitglied
Hallo,

ich habe folgendes Programm.
Mit diesem will ich zahlen in eine Liste schreiben und nach dem Prinzip von eratosthenes rausfinden, ob die gesuchte Zahl eine Primzahl ist.

Allerdings tritt deim Eingeben irgendeiner Zahl folgender Fehler auf:

Java:
java.lang.IndexOutOfBoundsException: Index: 56, Size: 54
	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
	at java.util.ArrayList.remove(ArrayList.java:387)
	at SiebdesEratosthenes2.isPrime(SiebdesEratosthenes2.java:38)


Programm:

Java:
import java.util.*;


public class SiebdesEratosthenes2
{
    

    public SiebdesEratosthenes2()
    {    
    }
    
    
    
    private static long abrunden(double n) {
        return Math.round(n);
    }
    
    
    private static boolean inListe(ArrayList liste, long n) {
        if (liste.contains(n)) return true;
        return false;
    }
    
    
    public static boolean isPrime(long n) {
        ArrayList zahlen = new ArrayList();
        for (long z=2; z<=n+1; z++) {
            zahlen.add(z);
        }
        for (int i=2; i<=abrunden(Math.sqrt(n)); i++) {
            if (zahlen.get(i) != null) {   
                for (int k=i; k<=abrunden(n/i); i++) {
                    zahlen.remove(k*i);
                }
            }
        }
        return inListe(zahlen, n);
    }
    
    
    
}

wo liegt der Fehler?
 
wenn du aus der ArrayList ein Element löschst, dann rücken alle anderen eine Position auf,
wahrscheinlich musst du
set(k*i,null);
statt
remove(k*i);
aufrufen,

oder verwende ein Array, da ist das leichter zu erkennen, da wird nix verrückt (im Sinne von verrücken),
die Anzahl Elemente kennst du ja vorher auch

edit:
oder du hast versehentlich die obige dieser beiden Methoden verwendet:
Java:
 E 	remove(int index)
          Removes the element at the specified position in this list.
 boolean 	remove(Object o)
          Removes the first occurrence of the specified element 
          from this list, if it is present.
dann musst du in diesem Fall den int manuell in einen Integer umwandeln
 
Zuletzt bearbeitet von einem Moderator:
also hab mal versucht mit set, aber da kommt auch der fehler, bloß mit gleichem wert, also:

Java:
java.lang.IndexOutOfBoundsException: Index: 64, Size: 64
	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
	at java.util.ArrayList.set(ArrayList.java:337)
	at SiebdesEratosthenes2.isPrime(SiebdesEratosthenes2.java:38)

was könnte jetzt noch falsch sein?
 
siehe edit im ersten Posting 😉

und noch ein edit:
> if (zahlen.get(i) != null) {
ist dann aber etwas seltsam, vielleicht doch besser Array und außer noch prüfen, ob außerhalb der Array-Grenzen
 
und wie genau muss ich das machen.
Es muss es ja als Object erkennen, aber wenn ich nen int eingebe mit neew Integer oder so hab ich ja dasselbe Problem
 
welches Problem mit welcher Exception bei welchen Code?
remove(new Integer()) kann doch kaum zu einer IndexOutOfBoundsException führen oder bei welchem Vorschlag bist du gerade
 
ok, klappt. Hatte was verwechselt.

Andere Frage: Ich habe es extra mit einer ArrayList gemacht, weil ich damit mehr Zahlen in die ArrayList aufnehmen kann. Aber wenn ich jetzt eine zu große Zahl eingebe, kommt wieder die Fehlermeldung, dass es größer als int ist. Aber eigentlich habe ich doch überall long genommen, oder?

hängt das mit den laufvariablen in den schleifen zusammen?
Aber wie könnte ich die ändern?
 
Zuletzt bearbeitet:
in eine ArrayList passen nur soviele Zahlen wie in ein Array, Integer.MAX_VALUE
 
kann ich denn dann eine normale list nehmen, oder was würdest du empfehlen, weil eigentlich soll es für unendlich viele/große werte gehen
 
LinkedList geht, kann aber sehr langsam werden wenn man die öfters durchlaufen muss, z.B. für die remove-Methode,
oder besser eine Menge von Arrays,
jedes davon mit Integer.MAX_VALUE erfordert eh 2 GB Arbeitsspeicher, wenn du also mehr als 2-3 hinbekommst, dann ist das schon ein Wunder 😉

in der Theorie kann man jedenfalls bei mehreren Arrays zu einem long-Index leicht das passende Array und den Index darin berechen, / und % Integer.MAX_VALUE
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben