Jede x-te Zeile, lösche 10 Zeilen

Diskutiere Jede x-te Zeile, lösche 10 Zeilen im Java Basics - Anfänger-Themen Bereich.
A

at0m

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!
 
sascha-sphw

sascha-sphw

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)
 
sascha-sphw

sascha-sphw

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
 
sascha-sphw

sascha-sphw

Aber den Unterschied zwischen
Java:
if(i % Integer.parseInt(x) == 0)
und
Java:
if(i == Integer.parseInt(x))
erkennst Du schon, oder?
 
A

at0m

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...
 
sascha-sphw

sascha-sphw

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.
 
mihe7

mihe7

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);
 
K

kneitzel

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 von einem Moderator:
Thema: 

Jede x-te Zeile, lösche 10 Zeilen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben