Liebe Leser,
Wenn dies Ihr erster Besuch hier ist, lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Sie müssen sich vermutlich registrieren, bevor Sie Beiträge verfassen können. Klicken Sie rechts auf 'Jetzt registrieren.', um den Registrierungsprozess zu starten.
Ergebnis 1 bis 5 von 5
  1. #1
    Registriert seit
    11.2007
    Beiträge
    32

    [Java] ArrayList.indexOf(Double)?

    Hallo mal wieder,

    diesmal versuche ich ein Programm zu schreiben, welches mir sämtliche Primfaktoren einer Zahl liefert. Zunächst sollen dafür Primzahlen nach dem Prinzip des Sieb des Eratosthenes ermittelt werden. Dazu benutze ich eine ArrayList, da man dort im Gegensatz zu Arrays Einträge streichen kann.
    Code:
    import java.util.ArrayList;
    
    public class BigPrimeFactors {
     ArrayList<Double> primfaktoren = new ArrayList<Double>();
     
     ArrayList<Double> primzahlen(double bis) {
      ArrayList<Double> zahlen=new ArrayList<Double>();
      
      //Sieb füllen
      for(double i=2; i<=bis; i++) {
       zahlen.add(i);
      }
    
      //Zahlen streichen
      for(double i=0; i<zahlen.size(); i++) {
       for(int j=2; zahlen.get((int)i)*j<=bis; j++) {
        zahlen.remove(indexOf(new Double(zahlen.get((int)i)*j)));
       }
      }
    
      return zahlen;
     }
    
     public static void main(String[] args) {
    
     }
    }
    Das Problem befindet sich in der längsten Zeile des Programms. Der Kompiler spuckt folgendes aus:
    Code:
    /tmp/jc_1866/BigPrimeFactors.java:17: cannot find symbol
    symbol  : method indexOf(java.lang.Double)
    location: class BigPrimeFactors
        zahlen.remove(indexOf(new Double(zahlen.get((int)i)*j)));
                      ^
    1 error
    Ich dachte bis jetzt, dass Double genau für solche Sachen gedacht wäre. Kann mir jemand sagen, wie es richtig wäre?

  2. #2
    Registriert seit
    06.2010
    Beiträge
    7
    Dein Code hat mehrere Probleme:

    - double sind Gleitkommanzahlen, Primzahlen sind aber Ganzzahlen
    - wenn du indexOf benutzt, dann als Methode der List zahlen
    - du machst dir die Sache viel zu umständlich, du brauchst doch bloß den Pseudocode von der Wikipedia-Seite 1:1 in Java umzusetzen

    Konstrukte wie
    Code:
    zahlen.remove(indexOf(new Double(zahlen.get((int)i)*j)));
    sind syntaktischer Unsinn und auch für diesen Algorithmus absolut unnötig.

    Ein kurze Überarbeitung deines Codes könnte so aussehen:

    Code:
        List<Integer> primzahlen(int grenze) {
            List<Integer> zahlen = new ArrayList<Integer>();
    
            for (int i = 2; i <= grenze; i++)
                zahlen.add(i);
    
            for (int i = 2; i * i <= grenze; i++)
                if (zahlen.contains(i))
                    for (int j = i * i; j <= grenze; j += i)
                        zahlen.remove((Integer) j);
    
            return zahlen;
        }
    Wie du siehst, ist das erheblich übersichtlicher als dein Ansatz.

  3. #3
    Registriert seit
    11.2007
    Beiträge
    32
    Das in der Zeile mehrere Fehler drin stecken, habe ich auch schon bemerkt. Theoretisch ließe sie sich auf
    Code:
    zahlen.remove(zahlen.indexOf(zahlen.get((int)i)*j);
    verkürzen. Dein Vorschlag ist tatsächlich besser.
    Double habe ich übrigens genommen, da größrere Zahlen benutzt werden sollten. Mir ist allerdings sehr schnell aufgefallen, dass ich dafür einfach viel zu wenig Speicher habe.
    Trotzdem danke.

  4. #4
    Registriert seit
    06.2010
    Beiträge
    7
    Praktisch lässt es sich noch viel weiter verkürzen:

    Code:
    zahlen.remove((Integer) (zahlen.get(i)*j));
    Das liegt ganz einfach daran, dass remove überladen ist und nicht nur die Angabe eines Indexes sondern auch direkt des zu löschenden Objektes erlaubt.

    Nur das mit dem Speicher klingt sonderbar. Dass dich eine Liste aus Zahlen in Speichernöte bringt halte ich für ziemlich abwegig.

  5. #5
    Avatar von daboom
    daboom ist offline Megabyte
    Mein System
    MainboardASUS P8P67 Pro
    ProzessorIntel Xeon 31230 (Scythe Mugen 3)
    GrafikkarteMSI Radeon HD7850
    RAM2x 4096 MB 1333 Teamgroup Elite
    Festplatte(n)2x WD Caviar Blue 500 GB
    Andere Laufwerke1x Asus DRW-24B3ST
    Netzteil (inkl. Spannungswerte)be quiet Straight Power E9 CM 580 W
    Soundkarte7.1 onBoard
    BetriebssystemWindows 7 Professional 64 Bit SP1 * Ubuntu Desktop 12.04 64 Bit
    AV-SoftwareAvira * N/A
    FirewallWindows * netfilter/iptables
    System-/OptimierungstoolsIs immer so die Frage, was mit Süstehmtuhls gemeint ist...
    Art des InternetzugangsUMTS
    MonitorSamsung Synchmaster 226CW * Acer AL1721
    SonstigesAntec Three Hundred Two
    Registriert seit
    09.2007
    Ort
    Zammwehr deirecktlie in Machtestadt
    Beiträge
    2.178
    Das mit dem Speicher kommt darauf an, wieviel man der VM gibt.

    mit -Xmx kann man dies dann erhöhen. Wenn man über eine bestimmte Grenze hinausschießt, kann das u.U. schon nötig sein.
    Geändert von daboom (Morgen um 25:03 Uhr).

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
12
Content Management by InterRed