Dateien sortieren (Datentypen, Variablen und Ausdrücke)
Schreiben Sie ein Programm, das zwei bereits sortierte Dateien öffnet und daraus eine dritte Datei erstellt, die schließlich die Inhalte von beiden Ursprungsdateien in sortierter
Reihenfolge enthält. Dabei haben alle Dateien pro Zeile genau einen Datensatz. Die beiden gegebenen Dateien könnten wie folgt aussehen (beachten Sie, dass die Datei nach der zweiten Spalte sortiert ist):
Datei A | Datei B |
|
|
Dabei ist es nich t gestatte t, beide Ursprungsdateien komplett in den Hauptspeicher (RAM) zu kopieren; in der Praxis sind solche Dateien oft zu groß. Lesen Sie vielmehr von beiden Dateien jeweils die nächste Zeile ein und entscheiden Sie danach, welcher der beiden Datensätze in die Ausgabedatei geschrieben werden muss. Dieses Verfahren nennt sich Merge-Sort (engl. merge = zusammenfügen), da zwei Stapel zusammengefügt werden.
0 Kommentare
1 Lösung(en)
/*------------------------------------------------------------*\
| Eher eine simulation, da hier keine echten dateien verwendet |
| werden, aber das prinzip bleibt gleich. |
\*------------------------------------------------------------*/
function mergeFiles(f1, f2, compItem) {
let buf1, buf2,
fOut = [];
while (f1.length > 0 && f2.length > 0) {
// lesepuffer, da wir nicht beide dateien im speicher haben können
if (!buf1 && f1.length > 0) buf1 = f1.shift();
if (!buf2 && f2.length > 0) buf2 = f2.shift();
// sätze an der entsprechenden stelle vergleichen,
// den prioritären in enddatei speichern, der andere bleibt im puffer
let c = buf1[compItem].localeCompare(buf2[compItem]);
switch (true) {
case (c == 0):
case (c < 0):
fOut.push(buf1); buf1 = undefined;
break;
case (c > 0):
fOut.push(buf2); buf2 = undefined;
}
}
// am ende der besenwagen (reste einkehren)
if (!!buf1) fOut.push(buf1);
if (!!buf2) fOut.push(buf2);
if (f1.length > 0) fOut = fOut.concat(f1);
if (f2.length > 0) fOut = fOut.concat(f2);
return fOut;
}
// test
let fileA = [
['Hans', 'Adalbert', 8377], ['Daniel', 'Bertrandt', 4490],
['Zeno', 'Daguerre', 8300], ['Henriette', 'Dupont', 8301],
['Gustav', 'Freimann', 8322], ['Anton', 'Freiwalder', 6002],
['Susi', 'Gaston', 4003]
];
let fileB = [
['Heidi', 'Balthasar', 4773], ['Regula', 'Birrle', 4490],
['Liliane', 'Caviezl', 8330], ['Bert', 'Etter', 3300], ['Rene', 'Gabriel', 2044],
['Simon', 'Guggisberg', 4402], ['Adrian', 'Gunten', 6000]
];
let mergedFile = mergeFiles(fileA, fileB, 1);
console.table(mergedFile); // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 1 |
Schwierigkeit: | k.A. |
Webcode: | htan-8xo5 |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |