Kleines Problem mit ArrayList

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Hallo,

hab bisher nur arrays verwendet, doch jetzt brauche ich ein "dynamisches array" da ich die groesse vorher nicht weiss. Also bin ich auf Arraylist gestossen, hab jedoch noch n paar kleine Probleme mit der Syntax:
Code:
	public static void teiler(long a){
		/* Pruefe fuer alle Zahlen kleiner a/2 ob sie Teiler von a sind */		
	
		List liste = new java.util.ArrayList();
		for(long i; i <= (a /2); i++){
			if ( ((a / 2) % i) == 0){
				liste.add(((a / 2) % i), i);
			}
		}
	}

In der Liste sollen alle Teiler von a gespeichert werden. Jetzt hab ich gelesen dass man in einer Arraylist keine einfachen Datentypen speichern kann, außer mit Hilfe von Wrapperklassen. Mit Java 1.5 soll das jedoch wieder funktionieren.
Wie löse ich das Problem oben am elegantesten?
 

Bleiglanz

Gesperrter Benutzer
Code:
liste.add(Long.valueOf(i))
du legst ja immer 0 rein bei deinem Code
 
B

Beni

Gast
Java 1.5:
Code:
List<Long> liste = new ArrayList<Long>();

// der Rest bleibt gleich
for(...){ ... }

Prä 1.5:
Code:
Long x = new Long( 123 );
list.add( x );
 

0001001

Bekanntes Mitglied
Bleiglanz hat gesagt.:
Code:
liste.add(Long.valueOf(i))
du legst ja immer 0 rein bei deinem Code
stimmt, kleiner fehler sollte liste.add( i, i); heissen.

Aber genau hier liegt mein Problem. Ich weiss leider nicht genau wie man auf einzelne ArrayList Objekte zugreift.
Bei einem array mache ich einfach array[0] = i oder array = 34899823
Wie aber schreibe ich in eine ArrayListe an eine bestimmte Stelle etwas?
 

0001001

Bekanntes Mitglied
Beni hat gesagt.:
Java 1.5:
Code:
List<Long> liste = new ArrayList<Long>();

// der Rest bleibt gleich
for(...){ ... }

Prä 1.5:
Code:
Long x = new Long( 123 );
list.add( x );

hab Version 1.5.

hab gerade gemerkt dass long nichts bringt da ich gar nicht so viel RAM habe um die ganzen Zahlen zu speichern, werd also int verwenden.

Die Syntax der Versionen vor 1.5 kapier ich aber damit komme ich nicht klar:
Beni hat gesagt.:
Java 1.5:
Code:
List<Long> liste = new ArrayList<Long>();
kannst du das mal an einem Beispiel erklären, genau gesagt das <Long>?
Wie greife ich auf ein bestimmtes Element der ArrayList zu?
 

Bleiglanz

Gesperrter Benutzer
warum willst du "an eine bestimmte" stelle was schreiben

liste.add(i,i) // ist size() gross genug??

führt doch nur zu einem Haufen "leerer" Einträge ohne den geringsten Informationsgehalt?

mach

liste.add(i)

schon allein wegen der automatischen Vergrösserung
 

0001001

Bekanntes Mitglied
Bleiglanz hat gesagt.:
liste.add(i)

schon allein wegen der automatischen Vergrösserung
danke, hab ich jetzt so gemacht.

Bleiglanz hat gesagt.:
warum willst du "an eine bestimmte" stelle was schreiben
naja an welche stelle er es schreibt ist mir egal, nur will ich aus allen werten der liste die summe berechnen.
wenn es ein array wäre würde ich es so machen:
Code:
int summe = 0;
for(int i = 0; i < array.length; i++)
	summe = summe + array[i];
}

jedoch hab ich keine ahnung wie das bei einer ArrayList geht.
 
B

Beni

Gast
0001001 hat gesagt.:
Die Syntax der Versionen vor 1.5 kapier ich aber damit komme ich nicht klar:
Beni hat gesagt.:
Java 1.5:
Code:
List<Long> liste = new ArrayList<Long>();
kannst du das mal an einem Beispiel erklären, genau gesagt das <Long>?
Wie greife ich auf ein bestimmtes Element der ArrayList zu?

Das besagt nur, dass in der Liste "Longs" sind. Damit kann der Compiler Autoboxing anwenden, und du kannst direkt lesen/schreiben.

Code:
List<Long> list = ...
list.add( 123 ); // schreiben
long x = list.get( 0 ); // lesen
 

0001001

Bekanntes Mitglied
sorry wenn ich mich da jetzt etwas anstelle aber was du <long> meinst verstehe ich nicht. (ich verwende int statt long)

Code:
List<long> liste = new ArrayList<long>();
geht nicht
genauso wenig wie
Code:
Listlong liste = new ArrayListlong();
und auch nicht:
Code:
int a;
List a liste = new ArrayList a();

stehe hier einfach auf dem Schlauch.
 
B

bygones

Gast
Collections können nur Objekte aufnehmen, keine primitiven Datentypen.

Die unteren beiden versionen sind syntaktisch einfach falsch, daher gehen sie nicht.

und da long der primitive Datentyp ist und Long die Klasse ist nur
Code:
List<Long> liste = new ArrayList<Long>();
korrekt
 

0001001

Bekanntes Mitglied
hm ich glaube wir reden ein wenig aneinander vorbei.
Hab hier ein paar Zeilen Code, der die Teiler der Zahl a berechnen soll und in der liste speichern soll.
Code:
	public static List teilerberechnen(int a){
		/* Pruefe fuer alle Zahlen kleiner a/2 ob sie Teiler von a sind */		
	
		List<int> liste = new ArrayList<int>();
		for(int i = 1; i <= (a /2); i++){
			if ( ((a / 2) % i) == 0){
				liste.add(i);
			}
		}
		return liste;
	}
Jedoch funktioniert das nicht. Ich weiss, dass man in einer ArrayList keine primitiven Datentypen speichern kann, ich hab nur das Problem mit der korrekten Syntax.
 
B

bygones

Gast
nochmal:

int und long == primitive Datentypen
Integer und Long == Klassen bzw. Objekte

nur Objekte können in Collections gespeichert werden, ergo muss es heißen

Code:
List<Long>;
bzw
Code:
List<Integer>;

allgemein - java sagt beim kompilieren immer (!) was das problem ist !
 

0001001

Bekanntes Mitglied
danke das hilft schon ein wenig.
Code:
	public static List teilerberechnen(int a){
		/* Pruefe fuer alle Zahlen kleiner a/2 ob sie Teiler von a sind */		
	
		List<Integer> liste = new ArrayList<Integer>();
		for(int i = 1; i <= (a /2); i++){
			if ( ((a / 2) % i) == 0){
				liste.add(i);
			}
		}
		return liste;
	}

alles klar danke so funktionierts!
 
S

SlaterB

Gast
übrigens sind nicht alle Teile von a/2 auch Teiler von a ;)
siehe Beispiel 2 als Teiler von 10, aber nicht von 5

Code:
  public static List teilerBerechnen(int a) {
      /* Pruefe fuer alle Zahlen kleinerGLEICH a/2 ob sie Teiler von a sind */      
   
      List<Integer> liste = new ArrayList<Integer>();
      for(int i = 1; i <= (a /2); i++){
         if ( (a % i) == 0){
            liste.add(i);
         }
      }
      return liste;
   }
 

0001001

Bekanntes Mitglied
SlaterB hat gesagt.:
übrigens sind nicht alle Teile von a/2 auch Teiler von a ;)
siehe Beispiel 2 als Teiler von 10, aber nicht von 5
da hast du recht.

Hab jetzt noch das Problem mit dem Aufruf der Methode:

Hier meine Main Methode:


Code:
	public static void main(String[] argv){
		// Ein Objektarray erzeugen		
		AllArrays[] aa = new AllArrays[5];
		for(int i = 0; i < 5; i++){
			aa[i].teiler = teilerberechnen(i);
			System.out.println(aa[i].teiler);
                }
        }

Hier die Klasse AllArrays:
Code:
import java.util.ArrayList;
import java.util.List;

public class AllArrays {
	int zahl;
	List<Integer> teiler = new ArrayList<Integer>();
	int summe;
}

und die Methode teilerberechnen:
Code:
	public static List<Integer> teilerberechnen(int a){
		/* Pruefe fuer alle Zahlen kleiner a/2 ob sie Teiler von a sind */		
	
		List<Integer> liste = new ArrayList<Integer>();
		for(int i = 1; i <= (a /2); i++){
			if ( (a % i) == 0){
				liste.add(i);
			}
		}
		return liste;
	}

Problem ist anscheinend das Objekt Array aa. Als Fehlermeldung bekomme ich java.lang.NullPointerException.
Wenn ich anstatt eines Objekt Arrays nur ein Objekt aa instanziere funktioniert es.[/code]
 

Bleiglanz

Gesperrter Benutzer
Code:
AllArrays[] aa = {new AllArrays(),new AllArrays(),new AllArrays(),new AllArrays(),new AllArrays()};
initialisieren nicht vergessen
 
B

Beni

Gast
Bleiglanz hat gesagt.:
Code:
AllArrays[] aa = {new AllArrays(),new AllArrays(),new AllArrays(),new AllArrays(),new AllArrays()};
initialisieren nicht vergessen
:shock:
Code:
AllArrays[] aa = new AllArrays[5];
for( int i = 0; i < aa.length; i++ )
  aa[i] = new AllArray();
Ist einfacher :wink:
 

0001001

Bekanntes Mitglied
So jetzt funktioniert alles.
Hier das Ergebnis:
Ein Programm, das befreundete Zahlen findet.
Befreundete Zahlen sind Zahlen, deren aufsummierte Teiler eine andere Zahl ergeben. Die aufsummierten Teiler der zweiten Zahl, ergeben dann wieder die erste Zahl.
Bsp: Befreundete Zahlen sind 284 und 220. Die Teiler von 284 sind (1,2,4,71,142) macht summiert 220. Die Teiler von 220 sind (1,2,4,5,10,11,20,22,44,55,110) macht aufsummiert 284.

Hier die Klasse Allarrays:
Code:
import java.util.ArrayList;
import java.util.List;

public class AllArrays {
	int zahl;
	List<Integer> teiler = new ArrayList<Integer>();
	int summe;
}

und noch die Klasse mit der Main-Methode:
Code:
import java.util.*;
public class FriendlyNumbers {
	/* Methode zum Berechnen aller Teiler einer Zahl außer duch sich selbst */
	public static List<Integer> teilerberechnen(int a){
		/* Pruefe fuer alle Zahlen kleiner a/2 ob sie Teiler von a sind */		
	
		List<Integer> liste = new ArrayList<Integer>();
		for(int i = 1; i <= (a /2); i++){
			if ( (a % i) == 0){
				liste.add(i);
			}
		}
		return liste;
	}
	
	public static int summeberechnen(List<Integer> liste){
		int summiert = 0;
		for (int i = 0; i < liste.size(); i++){
			summiert = summiert + liste.get(i);
		}
		return summiert;
	}
	
	
	public static void main(String[] argv){
		int obergrenze = 500000;
		// Ein Objektarray erzeugen		
		AllArrays[] aa = new AllArrays[obergrenze];
		// ... und initialisieren
		for (int i = 0; i < aa.length; i++){
			aa[i] = new AllArrays();
		}

		// Die schleife
		for(int i = 0; i < obergrenze; i++){
			aa[i].zahl = i + 1; // da sonst mit 0 begonnen werden wuerde
			aa[i].teiler = teilerberechnen(i+1);
			aa[i].summe = summeberechnen(aa[i].teiler);
			/* Jetzt werden in check zuerst die zeiler der summe der teiler der zahl berechnet
			 *  und die wird dann der summeberechnen uebergeben.
			 */
			int check = summeberechnen(teilerberechnen(aa[i].summe)); 
			if (check == aa[i].zahl){
				if (aa[i].zahl != aa[i].summe){
					System.out.println(aa[i].summe+" und "+check);
				}				
			}
		}
	}
}

Kleiner Schönheitsfehler: Ich kann nur Zahlen bis ca. 150000 testen, da mir die Anwendung dann mit folgender Meldung abbricht:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Obwohl eigentlich erst 670 MB Ram von 2048 MB voll sind...
 
B

bygones

Gast
0001001 hat gesagt.:
Kleiner Schönheitsfehler: Ich kann nur Zahlen bis ca. 150000 testen, da mir die Anwendung dann mit folgender Meldung abbricht:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Obwohl eigentlich erst 670 MB Ram von 2048 MB voll sind...
von was 670 MB ? meinst von deinem Hauptspeicher ?
das ist java an sich egal wieviel RAM du hast - java startet per default mit 64MB Hauptspeicher. Wenn du mehr geben willst kannst du dies per Startargumente -Xms 128M -Xmx 256M angeben (genaue Erklärung -> siehe Suche *g)


Das ein OutofMemory kommt ist nicht verwunderlich. Du hast im Grunde 500.000 ArrayListen mit bis zu 250.000 Einträgen - das kann schon den speicher sprengen behaupte ich mal
 

Bleiglanz

Gesperrter Benutzer
und völlig überflüssig - warum nicht gleich die Summen berechnen, wozu die Listen??

und du solltest die symmetrie ausnutzen, sonst
findest du ja

220 und 284
284 und 220

das ist überflüssig :)



Code:
    public static void methode1() {
        // braucht Speicher für alle berechneten summen
        // berechnet aber jeder Summe nur einmal
        final int[] teilerSummen = new int[MAX];
        for(int i=1;i<MAX;i++){
            final int aktuelleTeilerSumme = (teilerSummen[i] = teilerSumme(i));
            if(i>aktuelleTeilerSumme){
                final int j = teilerSummen[aktuelleTeilerSumme];
                if(j==i){
                    System.out.println("befreundet: "+i+" "+aktuelleTeilerSumme);
                }
            }
        }
    }
    
    public static void methode2() {
        // braucht wenig Speicher und ist langsamer
        // berechnet jede TeilerSumme zweimal
        for(int i=1;i<MAX;i++){
            int teilerSumme = teilerSumme(i);
            if(i<teilerSumme){
                long j = teilerSumme(teilerSumme);
                if(j==i){
                    System.out.println("befreundet: "+i+" "+teilerSumme);
                }
            }
        }
    }
    
    public static int teilerSumme(final int a){
        int summe = 0;
        for(int i = 1; i <= (a/2); i++){
            if ((a % i) == 0){
               summe += i;
            }
         } 
        return summe;
    }
 

Bleiglanz

Gesperrter Benutzer
btw ist teilerSumme ziemlich ziemlich langsam

für die Summe aller Teiler (inklusive a) gibts ne einfach zu implementierende rekursive Formel, man kann nämlich immer die höchsten Primfaktorpotenz abspalten usw.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Methoden Kleines Problem mit meinem Glücksrad... Java Basics - Anfänger-Themen 9
A Kleines Abbruch-Problem mit Do-While-Schleife Java Basics - Anfänger-Themen 4
D kleines problem bei system.out.println schreibweise Java Basics - Anfänger-Themen 6
C Kleines Problem mit System.out.print Java Basics - Anfänger-Themen 1
E Array zu Liste - kleines Problem Java Basics - Anfänger-Themen 6
J Vererbung Kleines Problem bei Vererbung! Java Basics - Anfänger-Themen 2
O Debug-Funktion mit Slick - Kleines Problem Java Basics - Anfänger-Themen 5
H Kleines Problem bei den Schleifen Java Basics - Anfänger-Themen 5
M Kleines Problem mit der Rekursion Java Basics - Anfänger-Themen 20
T kleines problem mit switch case Java Basics - Anfänger-Themen 11
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
R Login mit Datenbankabfrage: Kleines Problem! Java Basics - Anfänger-Themen 6
K Kleines Anfänger Problem bei der Abfrage Java Basics - Anfänger-Themen 8
X Kleines JMenuBar Problem Java Basics - Anfänger-Themen 8
P RSA Verschlüsselung kleines Problem Java Basics - Anfänger-Themen 5
P wahrscheinlich ein kleines Problem Java Basics - Anfänger-Themen 7
H Kleines Problem mit der Polymorphie Java Basics - Anfänger-Themen 2
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
K kleines Array-Problem Java Basics - Anfänger-Themen 6
C Kleines 2D Spiel. Problem. Java Basics - Anfänger-Themen 5
U Kleines Problem mit Konstruktor^^ Java Basics - Anfänger-Themen 7
D kleines Eclipse-Problem ! Java Basics - Anfänger-Themen 2
O Kleines Problem mit Konstruktor mit Parametern aus generischer Klasse...oder so ;) Java Basics - Anfänger-Themen 2
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S Kleines Problem... NaN, Infinity? Java Basics - Anfänger-Themen 9
B Drag and Drop fähige Trackliste..nurnoch ein kleines Problem Java Basics - Anfänger-Themen 16
G Kleines Problem mit File Java Basics - Anfänger-Themen 7
G Kleines Problem mit Nimmspiel Java Basics - Anfänger-Themen 8
U kleines problem bei ner aufgabe :( Java Basics - Anfänger-Themen 8
G Kleines Problem mit Array Java Basics - Anfänger-Themen 14
R Unicode-Wert in Binär und Dezimal umformen - kleines Problem Java Basics - Anfänger-Themen 1
G Kleines Problem Java Basics - Anfänger-Themen 3
S Ich habe ein kleines Problem mit meinem Übungsprogramm Java Basics - Anfänger-Themen 7
S Hab ein kleines Problem :) Java Basics - Anfänger-Themen 4
D noch ein kleines Problem Java Basics - Anfänger-Themen 4
M kleines generics problem Java Basics - Anfänger-Themen 15
B Kleines? Jedenfalls Problem mit Borland-Together! Java Basics - Anfänger-Themen 4
D Kleines Problem mit JDBC Java Basics - Anfänger-Themen 2
D Hab ein kleines Problem mit setScreenSize Java Basics - Anfänger-Themen 2
B kleines Problem Java Basics - Anfänger-Themen 3
G Kleines Problem Java Basics - Anfänger-Themen 5
A Kleines bzw. großes Problem ! Java Basics - Anfänger-Themen 2
Y kleines Problem Java Basics - Anfänger-Themen 9
J Kleines Problem mit Checkbox Java Basics - Anfänger-Themen 5
N Kleines Problem mit meiner ersten Klasse Java Basics - Anfänger-Themen 5
N kleines Problem mit meiner Schleife Java Basics - Anfänger-Themen 8
megachucky Kleines Problem mit dem "return" einer Methode. Java Basics - Anfänger-Themen 11
T moin leute hab ein kleines aber pikantes problem Java Basics - Anfänger-Themen 10
L nur kleines null Pointer Exception problem Java Basics - Anfänger-Themen 9
G kleines problem beim einlesen Java Basics - Anfänger-Themen 3
C Erstes kleines Problem - string in chat ? Java Basics - Anfänger-Themen 9
megachucky kleines problem mit einer nullpointer exception Java Basics - Anfänger-Themen 2
N Kleines Problem! Java Basics - Anfänger-Themen 7
megachucky kleines problem mit nem STACK Java Basics - Anfänger-Themen 8
P Kleines Problem Java Basics - Anfänger-Themen 2
G Kleines Problem Java Basics - Anfänger-Themen 7
S Kleines Java-Projekt; Kassenprogramm Java Basics - Anfänger-Themen 7
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
Koookie Kleines Frage - Antwort Programm (Anfänger) Java Basics - Anfänger-Themen 5
K Erstes kleines Spieleprojekt - Java GUI in HTML einbinden Java Basics - Anfänger-Themen 3
R Kleines Java Spiel funktioniert nicht. Java Basics - Anfänger-Themen 2
J Kleines Rechenprogramm Java Basics - Anfänger-Themen 13
G Erste Schritte Suche Java Programmierer für kleines Projekt Java Basics - Anfänger-Themen 1
Z Erste Schritte Kleines 2D. Spiel Objekt Bewegung funktioniert nicht Java Basics - Anfänger-Themen 2
B Input/Output Kleines Netzwerkproblem Java Basics - Anfänger-Themen 2
J OOP Kleines Schülerverwaltungsprogramm Java Basics - Anfänger-Themen 9
N ein kleines GUI mit einem hauch XML Java Basics - Anfänger-Themen 5
K Kleines Spiel auf Java programmieren Java Basics - Anfänger-Themen 2
T erstes kleines Programm Java Basics - Anfänger-Themen 17
S Kleines Quiz Programm Java Basics - Anfänger-Themen 4
C Hilfe - Kleines Programm macht mir Schwierigkeiten Java Basics - Anfänger-Themen 2
K Ein kleines Rätsel Java Basics - Anfänger-Themen 2
E Erstes "kleines" Programm Java Basics - Anfänger-Themen 5
A Best Practice Ideen für kleines Anfängerschulprojekt gesucht Java Basics - Anfänger-Themen 4
J kleines Karteikartenprogramm Java Basics - Anfänger-Themen 3
S Kleines Zeichen berechnen Java Basics - Anfänger-Themen 5
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
fLooojava Passwort generieren - kleines Programm Java Basics - Anfänger-Themen 15
H Kleines Prob Java Basics - Anfänger-Themen 5
J Flaechen vergleichen/kleines Fehler? Java Basics - Anfänger-Themen 23
K Kleines Projekt Java Basics - Anfänger-Themen 2
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
J Mal wieder ein kleines Toleranzproblem Java Basics - Anfänger-Themen 20
H kleines Spiel [Processing] Java Basics - Anfänger-Themen 7
R Kleines Programm, benötige Hilfe! Java Basics - Anfänger-Themen 6
D Kleines Abfrageproblem Java Basics - Anfänger-Themen 3
K kleines Rekursionsproblem Java Basics - Anfänger-Themen 7
B Suche kleines Java-Applet Java Basics - Anfänger-Themen 6
P Kleines Problemm mit einer NullPointerException Java Basics - Anfänger-Themen 2
R kleines Kunstprogramm "mkbox" perfektionieren Java Basics - Anfänger-Themen 13
P Kleines Projekt -> Große Überlegungen Java Basics - Anfänger-Themen 2
U Bitte Helfen kleines Spiel Java Basics - Anfänger-Themen 9
K Kleines Spiel / Daten speichern Java Basics - Anfänger-Themen 8
T Kleines Spiel realisieren - wie? Java Basics - Anfänger-Themen 6
T Kleines Verständnissproblem mit Regex Java Basics - Anfänger-Themen 4
S Kleines Kartenspiel mit Java Java Basics - Anfänger-Themen 2
I Kleines Program, fehler? Java Basics - Anfänger-Themen 2
S kleines Würfelspiel Java Basics - Anfänger-Themen 10
0 Frage zu Architektur: Server eines kleines Spiels Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben