Daten in ArrayList löschen

MrZylinder

Aktives Mitglied
Hallo Forum,

ich bin relativ neu in der Java-Welt und hab da mal eine Frage.

Ich möchte eine Textdatei auslesen und das ausgelesene in eine ArrayList speichern. Das funktioniert auch soweit super:
Java:
public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("datei"));
		
		String lesen = br.readLine();
		int i = 0;
		List<String> list1 = new ArrayList<String>();
		
		for(i = 0; (lesen = br.readLine()) != null; i++) {
			list1.add(lesen);
		}
			System.out.println(list1);
			
	}		
}
Ich hab mir dann mal die Anzahl der Einträge ausgeben lassen. Es sind 4328 Einträge.

Jetzt kommt mein Problem: Ich will jetzt z.B. alle Einträge die etwas mit "XY" zu tun haben löschen. Geht das? ???:L
Ich könnte ja immer den Index mit angeben, aber bei 4328 Einträgen ist das ein bisschen viel.

Ist dafür überhaupt eine ArrayList geeignet? ???:L

Ich hoffe es kann mir jmd weiterhelfen.
Vielen dank schonmal im Voraus
 
wie waers die mit "XY" gar nicht zu speichern ?

ansonsten muesstest du ueber die Liste iterieren und jeden Eintrag ueberpruefen und bei einem Treffer diesen entfernen.

4328 sind nicht sehr viel, eine ArrayList ist schon dafuer geeignet, auch wenn sie nicht die beste ist bei vielen loeschoperationen
 
wie waers die mit "XY" gar nicht zu speichern ?
Das wäre die beste Variante. Schont auch Resourcen.

Ansonsten kann man (um dem Thema gerecht zu werden) unerwünschte Elemente so entfernen.
Die Objekte müssen dabei von hinten nach vorn gelöscht werden, weil es sonst Exceptions hagelt.
So:
Java:
for(int i = 0, j = list1.size()-1; j > i; j--) {
   if(list1.get(j).equals("XY")) {
      list1.remove(j);
   }
}

Code ungetestet!
 
bzw im einfachsten Fall einfach so...:

Java:
for (i = 0; (lesen = br.readLine()) != null; i++) {
			if (!lesen.contains("XY")) {
				list1.add(lesen);
			}
		}

oder dir halt eine vernüftigen RegEx basteln und diesen nutzen...
 
wie waers die mit "XY" gar nicht zu speichern ?

Hmmm....von der Seite hab ich das noch gar nicht betrachtet. Nur wie gehe ich das an? Kann ich dem FileReader Schlüsselwörter mitgeben die er lesen soll oder der ArrayList sagen: "Hey, speicher mir bitte nur folgende Wörter"?
 
Hmm stehe ich jetzt aufm Schlauch?

Also ich hab in der Datei wo ich auslese z.B. folgendes stehn:

host_name = 123
contact_name = admin
is_flapping = 0
current_state = 0

So für mich sind eigentlich nur host_name und current_state von bedeutung.
Gehe ich jetzt hin und sag:
Java:
for (i = 0; (lesen = br.readLine()) != null; i++) {
            if (!lesen.contains("host_name=")) {
                list1.add(lesen);
            }
        }

Dann gibt er mir ja logischer weise immer alles aus. Weil die Bedingung ist: "Mach das wenn "host_name=" enthalten is. Oder?

Und bei der Variante gibt er mir auch wieder alles aus:

Java:
for (i = 0; (lesen = br.readLine()) != null; i++) {
            if (!lesen.equals("host_name=")) {
                list1.add(lesen);
            }
        }

Überseh ich irgendwas?

Das Problem ist ja auch das sich der Hostname immer ändern kann und current_state auch.
 
Zuletzt bearbeitet:
Das ! negiert den Ausdruck Du musst also prüfen ob der String "host_name =" oder "current_state =" enthält (contains) bzw. damit beginnt (startsWith)
Ansonsten ist "host_name=" natürlich nicht das selbe wie "host_name ="
 
erstens, heißt das wenn nicht

und zweitens heißt das eine contains zu deutsch beinhaltet, also würde "Hallo Welt" bei contains "Hallo" wahr liefern aber equals für gleich falsch da "Hallo Welt" nicht gleich "Hallo" ist.
 
Ich hoffe, dass ich Dich richtig verstanden habe. Du willst wissen, welchen Wert z. B. contact_name hat. Ich würde das so lösen:
Java:
if(line.startsWith("contact_name") //evt. weitere Krierien
//Das Speichern hast Du ja schon.

Bzw. Wenn die Zeile nicht damit beginnt:
Java:
if(line.contains("contact_name"))

Noch einen schönen Abend!

P. S.: Ich knausere mit Codeauszügen, weil ich mit einem 3GS schreibe... 😉
 
Java:
for (i = 0; (lesen = br.readLine()) != null; i++) {
			if (lesen.startsWith("host_name")
					|| lesen.startsWith("contact_name")) {
				list1.add(lesen);
			}
		}
 
So folgender Fortschritt hab ich:

Java:
for(i = 0; (lesen = br.readLine()) != null; i++) {		
				if((lesen.contains("host_name="))) {
					list1.add(lesen);
					}	
				}

Dies speichert mir dann alles was mit "host_name=" zu tun hat. Das is super - genau das was ich wollte.
Nun jetzt kommt noch dabei das ich die "current_state=" benötige.

Ich wollte das wie folgt einbauen:
Java:
for(i = 0; (lesen = br.readLine()) != null; i++) {		
				if((lesen.contains("host_name=")) && (lesen.contains("current_state="))) {
					list1.add(lesen);
					}	
				}

Jedoch is meine Ausgabe dann diese: []
Beides ist immer enthalten normal müsste das doch gehen...
 
Wieso eine for- anstatt einer while-Schleife? Das i wird gar nicht benötigt.

hast natürlich Recht, der TO hat den Code-Schnippsel so gepostet...klar eine while-Schleife wäre sinniger, aber who cares 😉

mal abgesehen, dass ich dir die richtige Lösung weiter oben schon gepostet habe...liest du Zeile für Zeile ein und fragst die einzelne Zeilen ab.

UND da gibt es keine Zeile die beides enthält...ein [c]||[/c] also [c]oder[/c] wäre etwas sinnvoller...
 
Ach irgendwie habe ich mich vertippt hab glaub nur ein | anstatt 2 || gemacht.

HEHE.


vielen Dank für eure Hilfe =) und für die schnelle Antwort =)
 

Neue Themen


Zurück
Oben