ArrayList.remove(i) funktioniert nicht

  • Themenstarter Themenstarter Unregistriert
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
U

Unregistriert

Gast
Hallo zusammen,

habe eine Stichprobe und will alle Werte die größer als ein Grenzwert sind aus der Stichprobe entfernen (der Umfang der Stichprobe verkleinert sich damit). Mit der Methode remove(i) sollten ja eigentlich die folgenden Werte aufrutschen. Allerdings werden bei komischerweise für die eliminierten Werte Nullen in die Liste geschrieben, so das er vor und nach dem Durchlaufen mit .size() den gleichen Wert ausgibt. Hier mal der Code:

Java:
for(int i=0;i<sample.size();i++)
   	{
       if(sample.get(i).doubleValue()>grenzwert)
    		{
    			sample.removeElement(i);

    		}
    }

Ich will keine Nullen drin haben, sondern einen kleinen Umfang der Stichprobe, da die statistischen Parameter voneinander abweichen. Hab auch schon mit .trim() versucht, klappt auch nicht. Auch wenn ich die Schleife die Stichprobe von hinten durchlaufen lasse - das selbe Ergebnis. Hoffe Ihr könnt mir helfen.

Vielen Dank im voraus.

MaRub
 
Also folgendes funktioniert bei mir:
Java:
                List<Double> sample = new ArrayList<Double>();
		sample.add(5.0);
		sample.add(7.0);
		System.out.println("Die Größe: "+sample.size());
		for (int i=0; i<sample.size(); i++)
		{
			System.out.println(sample.get(i));
		}
		System.out.println("===============");
		sample.remove(1);
		System.out.println("Die Größe: "+sample.size());
		for (int j=0; j<sample.size(); j++)
		{
			System.out.println(sample.get(j));
		}

Poste vielleicht nochmal deine Implementierung der Liste.

Gruß
Fenixx
 
Ich glaube das Problem ist, dass wenn du ein Element aus der Liste entferst, dass dann das Element bei der Iteration fehlt. Es gibt da schon spezielle Dinge für, aber ich würde dir empfehlen, falls es eine Methode ist, einfach eine neue Liste zu definieren.

[Java]

List<Double> listOhneGrenzwerte = new List<Double>();

for(int i=0;i<sample.size();i++)
{
if(sample.get(i).doubleValue()<grenzwert)
{
listOhneGrenzwerte.add( sample.get(i) );

}
}

return listOhneGrenzwerte;
[/Java]
 
oder nutze einfach die Google Collections mit filter funktion...
 
Du kannst nicht während des Durchlaufens der Schleife ein Element direkt aus der Liste löschen. Dafür musst du den Iterator benutzen:

Java:
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.iterator();
while( iterator.hasNext() ) {
    String next = iterator.next();
    if ( next.equals("foo") ) {
          iterator.remove();
     }
}
 
man kann auch in einer Schleife löschen, sollte zumindest so sein, weil es sonst echt "bescheiden" wär. aber du musst bedenken, dass du das element am index rausnimmst und das was vorher dahinter stand jetzt am index steht

ein beispiel

index=1;value=1
index=2;value=2
index=3;value=3

lösche index=2

index=1;value=1
index=2;value=3

Java:
Collection<Integer> test = new ArrayList<Integer>();
		
test.add(1);
test.add(2);
test.add(3);

for (int i = 0; i < test.size(); i++) {
	if (i == 1) {
		test.remove(2);
	}
}
		
for (Integer i: test) {
	System.out.println(i);
}
 
Zuletzt bearbeitet:
man kann auch in einer Schleife löschen, sollte zumindest so sein, weil es sonst echt "bescheiden" wär.

Bei einer ArrayList und einer normalen for-Schleife könnte das sicher noch gehen, indem man dann einfach i um 2 erhöht. Was ist aber bei einer LinkedList? Oder anderen beliebigen Collections? Oder man benutzt eine for-each-Schleife? Da kannst du nicht direkt aus der Liste löschen. Der "Umweg" über den Iterator funktioniert immer.
 
du löscht nicht das Element am Index, sondern das Objekt. Du gibst das Objekt an und nicht den Index. Wo das Objekt steht, das sucht sich die Collection schon von ganz alleine siehst du am Quelltext :rtfm:


@ Gast
so müsste das dann aussehen. es kann sein, dass auch alle gleichen Objekte mit rausgelöscht werden könnten 😀

Java:
for(int i=0;i<sample.size();i++)
{
	if(sample.get(i).doubleValue()>grenzwert)
	{
		sample.removeElement(sample.get(i));
	}
}
 
Zuletzt bearbeitet:
Vielen Dank schon mal für die Antworten.

läuft jetzt.
hatte es vorher auch schon mal so wie in icarus2 vorschlag gemacht, ging aber auch nicht. jetzt gehts doch. lag daran da ich das objekt vorher nicht geclont hatte und daher schon verändert war. ist mir nicht aufgefallen da ich in der methode zuvor nämlich die werte größer dem grenzwert zu null gesetzt hatte (dabei wollte ich das auch so).

naja egal, vielen dank trotzdem!
 
Java:
for(int i=0;i<sample.size();i++)
{
	if(sample.get(i).doubleValue()>grenzwert)
	{
		sample.removeElement(sample.get(i));
	}
}
oder eben mit Google Collections
Java:
Collections2.filter(sample, new Predicate<Double>() {
   public boolean apply(Double input) {
      return input.doubleValue() < grenzwert
   }
}
in diesem Sinne... Java braucht closures...
[groovy]sample.findAll { value -> value > grenzwert }[/groovy]
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben