2016-04-15 3 views
2

Mein Lehrer gab eine Aufgabe, die ich nicht vollständig verstehe. Es ist in Java. Hier ist die Zuordnung:So importieren Sie Daten aus Datei und drucken in geordneten Spalten in Java

Sales Report

Sie sind ein Programm zu schreiben, das die Informationen aus einer Datei erhalten. Der Dateiname lautet Inventory.dat. Das Format der Aufzeichnungen dieser Datei sind, um: Artikelnummer (integer) Elementname (string) Zahl verkauft (integer) Kosten (double)

es können mehrere Datensätze für jede Position Name sein. Es gibt keine Sequenz für diese Datei.

Sie müssen einen Bericht erstellen, der den Artikelnamen, die verkaufte Menge (Anzahl verkauft) und die Kosten für diesen Artikel anzeigt. Die Berichtssequenz wird in absteigender Reihenfolge angezeigt.

wird es eine Summe am Ende der Seite sein. Sie müssen den Bericht in drei Spalten mit Spaltenüberschriften drucken.

, dass die Zuordnung ist, und hier ist mein Code:

public static void main(String[] args) throws IOException { 
     FileReader freader = new FileReader("E:/Personal/Inventory.dat"); 
     BufferedReader file = new BufferedReader(freader); 
     int numberSold; 
     double cost; 
     String numberSoldParse; 
     String costParse; 
     double costTotal = 0; 
     int numberSoldTotal = 0; 
//   
     //print column headings 
     System.out.println("Item Name:  Qty Sold:  Total:"); 

     for (String itemName = file.readLine(); itemName != null; itemName = file.readLine()) { 
      //print file in columns 
      numberSoldParse = file.readLine(); 
      numberSold = Integer.parseInt(numberSoldParse); 
      costParse = file.readLine(); 
      cost = Double.parseDouble(costParse); 
      //totals 
      costTotal = costTotal + cost; 
      numberSoldTotal = numberSoldTotal + numberSold; 
      //sort 

      System.out.printf("%-21s %-10s %4.2f%n", itemName, numberSold, cost); 
     } 

     //print totals 
     System.out.println("___________________________________________"); 
     System.out.printf("%-21s %-10d %4.2f%n", "Total:", numberSoldTotal, costTotal); 
     System.exit(0); 
    } 

} 

Hier ist meine Ausgabe. Wie kann ich sie in absteigender Reihenfolge nach Kostenspalte abrufen? Ich bin ratlos. Bitte helfen Sie.

Item Name:  Qty Sold:  Total: 
Malibu    1   20000.00 
Subaru    2   20000.00 
F150     1   30000.00 
Camaro    1   30000.00 
BMW     1   30000.00 
Audi     2   29000.00 
___________________________________________ 
Total:    8   159000.00 
+0

Sie müssen die Daten in irgendeiner Weise sammeln. Füge jedes Element (eine Linie) zu einer Sammlung irgendeiner Art hinzu (ich würde wahrscheinlich ein Objekt wie SoldItem erstellen, um jede Zeile darzustellen, aber keine Schulaufgabe scheint sich überhaupt um OO zu kümmern, die ich gesehen habe). Wiederholen Sie dann die Sammlung, sammeln Sie die Summen, sortieren und geben Sie sie aus. – KevinO

+0

Ich darf ArrayList nicht verwenden. nur normale arrays und bubblesort – aarontemp

+0

Alles, was Sie mit einer ArrayList tun können, kann mit Arrays nicht-OO gehandhabt werden. Wenn Sie jedoch Einschränkungen haben, müssen Sie diese in Ihrer Frage auflisten, da sie Teil der Anforderungen sind. Sie sollten auch lesen, was ** ist ** in der Zuweisung, die besagt, dass es mehr als eine Zeile für einen bestimmten Artikel geben kann, und keine, wo im ursprünglichen Code Sie nach Artikel ansammeln. – KevinO

Antwort

0

Für den Abschnitt, in dem Sie in den Daten (und den Druck auf die Konsole) gelesen [gegeben, dass Sie only normal arrays and bubblesort verwenden]

Sie können 3-Arrays haben. Ich weiß nicht, wie viele max Einträge, die Sie haben, aber sagen, Sie haben 100.

String[] itemNames = new String[100]; 
int[] numbersSold = new int[100]; 
double[] costs = new double[100]; 
int curIndx = 0; 

for (String itemName = file.readLine(); itemName != null; itemName = file.readLine()) { 
    // add item name 
    itemNames[curIndx] = itemName; 

    //print file in columns 
    numberSoldParse = file.readLine(); 
    numberSold = Integer.parseInt(numberSoldParse); 

    // add number sold 
    numbersSold[curIndx] = numberSold; 

    costParse = file.readLine(); 
    cost = Double.parseDouble(costParse); 

    // add cost 
    costs[curIndx] = cost; 

    // increment indx pointer 
    curIndx++; 
} 

Für die Blase-Art auf der Reihenfolge der Kosten absteigend.Stellen Sie beim Swapping sicher, dass die entsprechenden Indizes itemNames und numbersSold neben den Indizes costs getauscht werden.

Sobald das erledigt ist, können Sie mit dem Drucken wie gewohnt fortfahren. Lass es mich wissen, wenn etwas nicht klar ist. Ich füge mehr Code oder was immer benötigt wird hinzu. :)

0

Da Sie Java lernen, warum schreiben Sie keine Codes in objektorientierter Weise?

Sie können eine Klasse mit dem Namen item einrichten, um Ihre Daten mit name/cost zu sammeln, und eine andere Klasse namens sale, um die Gesamtsumme eines Artikels zu sammeln. Dann können Sie sie mit Komparatoren sortieren.

0

Es könnte mehr als einen Weg geben, um Ihre gewünschte Lösung zu erreichen. Eine Möglichkeit wäre, ein Map of String-Objekt als Schlüssel und ein List-Objekt von Maps of String, Integer als Wert zu verwenden. Z.B. Map<String, ArrayList<Map<String, Integer>>> hashMap = new HashMap<String, ArrayList>(); Also in Ihrer 'for' Schleife, anstatt die Daten auf der Konsole für jede Zeile zu drucken, werde ich die Daten zu dieser Karte hinzufügen. In diesem Fall ist die "Summe" der Schlüssel zur Hauptkarte. Und eine Liste der Karten (innere Karte) des Artikels als Schlüssel und Menge als Wert ist der Wert für die Hauptkarte. Beim Hinzufügen jedes Eintrags zur äußeren Karte müssen Sie prüfen, ob die Karte diesen Schlüssel bereits enthält (total). Wenn dies der Fall ist, müssen Sie zunächst den Wert des Werts (eine Liste der Gesamt- und Qt-Map) abrufen und dann den neuen Eintrag zur Liste hinzufügen und die aktualisierte Liste wieder zur äußeren Map hinzufügen. Sobald die äußere Karte vollständig ausgefüllt ist, können Sie eine Sortiermethode Collections für den Schlüssel ausführen (total). Führen Sie dann eine weitere for-Schleife aus, um diese sortierten Einträge in dem von Ihnen gewünschten Format zu drucken.

Ich weiß, dass ich einen komplizierten Ansatz vorschlage, um Ihr Ziel zu erreichen. Aber wenn Sie keine Lösung finden, können Sie diesen Ansatz versuchen. Lassen Sie mich wissen, ob ich Ihnen weiterhelfen kann.

+0

Es wäre einfacher zu tun 'Map ', nachschlagen, wenn es existiert (erstellen Sie eine 'neue Doppel [2]' falls nicht und unter dem Namen hinzufügen). Erhöhen Sie die Summe in dem gefundenen doppelten Array entsprechend. Weniger Komplexität. – KevinO

+0

@KevinO, was wird der Schlüssel in dieser Karte sein? "Artikelname"? Wenn ja, wie steht es mit der "Menge an Gegenständen"? Wie wird die Sortierung durchgeführt? Kannst du etwas erklären? – VHS

+0

Ja, der Name des Artikels wäre der Schlüssel, die Menge ist doppelt [0] und die Summe ist doppelt [1]. Ich nehme an, der Punkt ist, eine Datei zu lesen, die doppelte Einträge hat, sammeln den Gesamtbetrag für einen bestimmten Eintrag (zB gibt es mehrere Suburu-Verkäufe, und das Ziel ist es, eine Ansammlung aller Verkäufe zu haben; ich finde die Anweisungen ein bisschen unklar). Wenn der Punkt nur darin besteht, jede Zeile zu lesen und dann zu sortieren, wäre die Lösung etwas anders. Bearbeiten Sie dann den Map.Entry-Satz von der Karte. – KevinO

0

Eine andere Lösung, die ich mir vorstellen kann, ist auch ein wenig komplex ist über die Definition einer neuen Klasse namens "SalesData", die die java.lang.Comparable Schnittstelle implementieren wird. Z.B. public class SalesData implements Comparable<SalesData>. Es gibt 3 Mitgliedsfelder dieser Klasse: 1. Artikelname 2. Menge 3. Gesamtverkauf. Sie fügen dieser Klasse eine compareTo-Methode hinzu, die den Vergleich des 2 SalesData-Objekts nur auf der Grundlage des Felds "Gesamtverkauf" durchführen kann. Anstatt die Daten zu drucken, würden Sie in Ihrer for-Schleife ein Objekt der SalesData-Klasse mit diesen Daten erstellen. Am Ende des Lesens aller Zeilen haben Sie eine Liste von "SalesData" -Objekten. Dann können Sie Collections.sort in dieser Liste aufrufen. Die Sortierung verwendet Ihre compareTo-Methode in der Klasse SalesData, um die Sortierung durchzuführen. Nach dem Sortieren können Sie die Daten im gewünschten Format ausdrucken. Lassen Sie mich wissen, wenn ich mehr Informationen zur Verfügung stellen kann.

+0

OP hat auch in Kommentaren gesagt: 'Ich darf ArrayList nicht verwenden. nur normale Arrays und bubblesort' –

+0

Es war kein Addendum. Es war eine separate Antwort. Auch nirgendwo in der Problembeschreibung hat das OP erwähnt, dass er keine ArrayList verwenden darf. Selbst wenn er keine ArrayList verwenden darf, kann er alternative List-Objekte wie CopyOnWriteArrayList verwenden. Meine Absicht war es, eine konzeptionelle Lösung zu geben. – VHS

Verwandte Themen