Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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
Hans, Adalbert, 8377
Daniel, Bertrandt, 4490
Zeno, Daguerre, 8300
Henriette, Dupont, 8301
Gustav, Freimann, 8322
Anton, Freiwalder, 6002
Susi, Gaston, 4003
… … …
Heidi, Balthasar, 4773
Regula, Birrle, 4490
Liliane, Caviezl, 8330
Bert, Etter, 3300
Rene, Gabriel, 2044
Simon, Guggisberg, 4402
Adrian, Gunten, 6000
… … …

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

Bitte melde dich an um einen Kommentar abzugeben

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 1
Schwierigkeit: k.A.
Webcode: htan-8xo5
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Zu Aufgabenblatt hinzufügen