Jede x-te Zeile, lösche 10 Zeilen

Bitte aktiviere JavaScript!
Hallo zusammen,

ich habe eine kleine Aufgabe zu lösen und stehe momentan auf dem Schlauch, obwohl es sich grundsätzlich recht einfach anhört.
Und zwar lese ich mehrere Dateien ein, verbinde sie zu einer und muss in der Enddatei an jeder x-ten Zeile, y Zeilen löschen. Die Benutzerabfrage, das Einlesen und Mergen der Datei funktioniert tadellos (den Code füge ich mal nicht ein, da er für das konkrete Problem irrelevant ist) aber das Löschen der Zeilen bereitet mir Kopfzerbrechen.

Hier ist was ich bereits habe:
Java:
// Initialisierte Liste "lines" mit den Zeilen wird
// hier kopiert. Die zu löschenden Zeilen sollen aus
// der ArrayList "cleanLines" gelöscht werden.
ArrayList<String> cleanList = new ArrayList<>(lines);
int i = 0;
while (i < lines.size()) {
    // x ist der vom Benutzer eingegebene Wert für x
    if (i == Integer.parseInt(x)) {
        // y ist der vom Benutzer eingegebene Wert für y
        for (int j = 0; j < Integer.parseInt(y); j++) {
            cleanList.remove(i);
        }
    }
    i++;
}
// schreibe die ArrayList in eine Datei (funktioniert)
writeLinesToFile(cleanList);
Das funktioniert leider nur beim ersten Durchlauf. Kann mir jemand auf die Sprünge helfen, wie man die Schleife erweitern müsste, damit der Loop nicht nur einmalig Auswirkungen auf die Datei hat?

Würde mich sehr freuen. Vielen Dank im Voraus!
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Du löscht ja nicht an jeder x-ten Zeile, sondern nur an Zeile x.
Jede x-te Zeile wäre
Java:
if(i % Integer.parseInt(x) == 0)
 
Das ist jetzt die Frage, habe ich Dich richtig verstanden oder nicht.

Nehmen wir an wir haben x = 3 und y = 2
Deine Bedingung führt dann zu.
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5

Zeile 6
Zeile 7
Zeile 8
Zeile 9
Löscht insgesammt nur 2 Elemente.

Die Bedingung mit Modulo macht folgendes.
Zeile 1
Zeile 2

Zeile 3
Zeile 4
Zeile 5

Zeile 6
Zeile 7
Zeile 8

Zeile 9
Löscht also immer da wo durch 3 geteilt werden kann.

Und wenn man jetzt noch den Index zur Zeilennummer normalisiert, dann sieht das so aus.
Java:
if (i+1 % Integer.parseInt(x) == 0)
Zeile 1
Zeile 2
Zeile 3
Zeile 4

Zeile 5
Zeile 6
Zeile 7

Zeile 8
Zeile 9
 
Aber den Unterschied zwischen
Java:
if(i % Integer.parseInt(x) == 0)
und
Java:
if(i == Integer.parseInt(x))
erkennst Du schon, oder?
 
Aber den Unterschied zwischen
Java:
if(i % Integer.parseInt(x) == 0)
und
Java:
if(i == Integer.parseInt(x))
erkennst Du schon, oder?
Jep, den erkenne ich. ;)

Ich habe vor folgendes zu machen. x = 4, y = 2

1
2
3
4
5

6
7
8
9
10

11
12
usw.

Also alle vier Zeilen werden zwei Zeilen gelöscht.
Meine Anweisung führt dies zwar durch, jedoch leider nur einmalig, sprich im Beispiel würde nur die 4 und 5 gestrichen werden. Irgendwie kommt ich da nicht weiter...
 
Aber dann habe ich Dir die Lösung des Problems doch bereits geliefert. Hast Du die Bedingugn denn mal versucht?
Java:
// Initialisierte Liste "lines" mit den Zeilen wird
// hier kopiert. Die zu löschenden Zeilen sollen aus
// der ArrayList "cleanLines" gelöscht werden.
ArrayList<String> cleanList = new ArrayList<>(lines);
int i = 0;
while (i < lines.size()) {
    // x ist der vom Benutzer eingegebene Wert für x
    if (i+1 % Integer.parseInt(x) == 0) {
        // y ist der vom Benutzer eingegebene Wert für y
        for (int j = 0; j < Integer.parseInt(y); j++) {
            cleanList.remove(i);
        }
    }
    i++;
}
// schreibe die ArrayList in eine Datei (funktioniert)
writeLinesToFile(cleanList);
Edit: Mein Fehler, ich erkenne das Problem. Wenn Du die Elemente löscht, verschiebt sich ja der Index. Lösung wäre, das ganze rückwärts zu machen. aber dennoch mit der Modulo Bedingung.
 
Oder eben nicht löschen:
Java:
ArrayList<String> cleanList = new ArrayList<>();
int xth = Integer.parseInt(x);
int i = 0;
int n = lines.size();
while (i < n) {    
    if ((i+1) % xth == 0) {
        i += y;
    } else {
        cleanList.add(list.get(i));
        i++;
    }
}
writeLinesToFile(cleanList);
 
Also da sollte man sich erst einmal einen Pseudo-Code überlegen, wie man das lösen könnte. Ich sehe hier mehrere Möglichkeiten. Eine Möglichkeit wäre, da alles mit mathematischen Berechnungen zu machen. Das geht relativ gut, denn dazu muss man sich nur überlegen, wie das Vorgehen ist:
Kurze Klärung:
Wir haben eine Liste mit Elementen. Alle x Elemente sollen y Elemente gelöscht werden:
Also bei x = 4 ,y =2: wäre 1, 2, 3, (4), (5), 6, 7, 8, (9), (10), ...
6, 7, 8 werden somit zum 4, 5, und 6 ten element, wenn 4 und 5 gelöscht werden.

Somit könnte man einen folgenden Pseudo Code schreiben:
- zeiger = x
- Solange zeiger < Größe der Liste:
---> Lösche die nächsten y Elemente so diese vorhanden sind.
---> zeiger = zeiger + x

Da muss man dann nichts mehr berechnen oder so.

Oder statt die Liste am Anfang zu kopieren und dann Elemente zu löschen:
- Zeiger = 0.
- zaehler = 0
- Solange zeiger < Größe OriginalListe
---> zaehler um eins erhöhen
---> falls zaehler größer x + y dann zaehler = 1
---> falls zaehler kleiner oder gleich x dann kopiere zeiger-Element aus alter Liste in neue Liste.
---> zeiger um eins erhöhen

Dann würde man nur die Element kopieren, die kopiert werden müssten.

Und das alles mit minimaler Mathematik, was den Code aus meiner Sicht einfacher verständlich macht.

Edit: Die Einrückung mit Leerzeichen hat er nicht genommen, daher habe ich die Einrückung nun mit ----> deutlich gemacht.
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben