Java: Hat String die Zahl 0 enthalten?

2 Antworten

Ja. Entweder per Schleife:

for (String row : SR1) {
	if (row.contains("0")) {
		System.out.println(row);
	}
}

oder per Stream:

Arrays.stream(SR1).filter(s->s.contains("0")).forEach(System.out::println);

Das Problem an deiner Aufgabenstellung ist nur, dass jede der Zeilen mehrere Nullen hat, daher wird auch jede Zeile ausgegeben.

Ich würde dir empfehlen eine Klasse für diese SR-Einträge zu erstellen, bzw. in diesem Fall reicht auch ein record:

record SR (String ip, int connect, int ios, int pwd, int enable, int ssh, int sshv2, int ipv6) {
	public static SR parse(String line) {
		if (line.matches("\\D*\\d+(\\.\\d+){3}(\\D+\\d){7}")) {
			String[] fields = line.strip().split("\\s*,\\s*");
			return new SR(fields[0], Integer.parseInt(fields[1]), Integer.parseInt(fields[2]), Integer.parseInt(fields[3]), Integer.parseInt(fields[4]), Integer.parseInt(fields[5]), Integer.parseInt(fields[6]), Integer.parseInt(fields[7]));
		} else {
			throw new java.lang.IllegalArgumentException("line doesn't have the right format");
		}
	}
}

Dann kannst du eine Liste mit SR-Objekten anlegen:

List<SR> srList = Arrays.stream(SR1).map(SR::parse).toList();

und kannst dann für jede Eigenschaft einzeln filtern, ob sie 0 ist. Z.B. wenn du nur die Objekte haben willst, bei denen "enable" = 0 ist, geht es so:

srList.stream().filter(sr->sr.enable()==0).forEach(System.out::println);

Ja, genau so.

for-Schleife, da drin für jede Zeile prüfen ob sie dem Kriterium entspricht (z.B. Regular Expression Matcher oder ein simples z.contains("0"), je nachdem was du vor hast).

Im Falle eines Treffers die Zeile z ausgeben, z.B. System.out.println(z).

Wenn du auf erschwerte Bedingungen stehst kannst du auch mit Streams arbeiten (statt der Schleife). :D


daCypher  22.04.2022, 08:14

wieso erschwerte Bedingungen? Mit dem Stream wäre das viel kürzer, als mit der Schleife:

Arrays.stream(SR1).filter(s->s.contains("0")).forEach(System.out::println);
0
ArchEnema  22.04.2022, 10:10
@daCypher

Ja.

Aber was da passiert und wieso und warum, das erklärst du ihm. ;)

Kürzer ist nicht immer besser. Ahem. :D

0
daCypher  22.04.2022, 10:15
@ArchEnema

Stimmt. Um die Streams zu verstehen, muss man in erster Linie die Lambda-Ausdrücke verstehen. Das hat bei mir auch eine Weile gedauert, bis es "klick" gemacht hat. Hab's im Endeffekt mit dem Oracle Tutorial gelernt. Da werden auch ein paar der Stream-Funktionen nachgebaut, damit man weiß was sie machen.

0
ArchEnema  22.04.2022, 10:21
@daCypher

Ich hab nicht wirklich was gegen Lambdas (zumal ich auch schon mit funktionalen Programmiersprachen wie Scheme zu tun hatte). Aber lesbar sind solche Ausdrücke leider nicht besonders, erst recht nicht in so einer Stream-Pipeline.

Und so ist eine verständliche for-Schleife mit 3 Zeilen und nem if eben oft hilfreicher, als so ein Konglomerat von Stream-Funktionen.

Ich glaube Einsteiger sollten erstmal die for-Schleifen und if-Statements verinnerlichen, bevor sie mit Lambdas und Stream-Filtern anfangen. Sonst zäumt man das Pferd von hinten auf...

0