2016-04-15 2 views
2

先生は、私が完全に理解していないという課題を出しました。これはjavaにあります。ファイルからデータをインポートし、Javaの列で印刷する方法

売上レポート

あなたはファイルから情報を取得するプログラムを書くことは、次のとおりです。ここでは割り当てがあります。ファイル名はInventory.datです。順番に このファイルのレコードのフォーマットは、次のとおり 項目数(整数) 項目名(文字列)販売 数(整数) コスト(ダブル)

各項目名に対して複数のレコードが存在してもよいです。このファイルにはシーケンスはありません。

あなたは、そのアイテムのアイテム名、数量(販売数)、およびコストを示すレポートを作成する必要があります。レポートの順序は降順になります。

ページの下部に合計が表示されます。 レポートを3つの列に列見出しで印刷する必要があります。

割り当てであり、ここでは私のコードです:ここでは

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

} 

は私の出力です。どのように私はコスト列で降順にそれらを得ることができますか?私は困惑している。助けてください。

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

何らかの方法でデータを蓄積する必要があります。いくつかの並べ替えのコレクションに各項目(行)を追加します(おそらく、各行を表すSoldItemなどのオブジェクトを作成しますが、私が見たオブジェクト指向について気にする必要はありません)。次に、コレクションをループし、合計を集め、ソートして出力します。 – KevinO

+0

ArrayListを使用することはできません。 – aarontemp

+0

ArrayListでできることは、配列を使って非OO形式で処理することができます。しかし、制約がある場合は、それらが要件の一部であるため、質問内の制約をリストする必要があります。また、あるアイテムに複数の行が存在する可能性があり、元のコードのどこに項目が累積しているのかはわかりません。 – KevinO

答えて

0

あなたが3つの配列を有することができる

[あなたはonly normal arrays and bubblesortを使用できることを考えます]。私はあなたが持っているどのように多くの最大のエントリを知っていますが、コストの高い順にバブルソートのために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++; 
} 

を持って言うことはありません。スワップする間に、itemNamesnumbersSoldの適切なインデックスがcostsのインデックスに沿ってスワップされていることを確認します。

これが完了したら、通常どおり印刷を続けることができます。何かが明確でない場合は教えてください。コードを追加したり、必要なものを追加します。 :)

0

Javaを学んでいるので、オブジェクト指向の方法でコードを書くのはなぜですか?

名前とコストのデータを収集するitemというクラスと、saleという別のクラスを設定して、異なるアイテムの合計を収集し、コンパレータで並べ替えることができます。

0

目的のソリューションを実現する方法は1つ以上あります。私がそれを行う1つの方法は、キーとしてStringオブジェクトのMapを使用し、値としてString、IntegerのMapsのListオブジェクトを使用しています。例えば。 Map<String, ArrayList<Map<String, Integer>>> hashMap = new HashMap<String, ArrayList>();したがって、 'for'ループでは、各行のコンソールにデータを出力する代わりに、このマップにデータを追加します。この場合、「合計」がメインマップのキーになります。そして、キーとしてitemのマップ(内部マップ)のリストと、値としてのquantityがメインマップの値になります。外部マップに各エントリを追加する際には、マップにそのキー(合計)が既に含まれているかどうかを確認する必要があります。そうであれば、最初にその値(totalとqtyマップのリスト)を取得してから、新しいエントリをリストに追加し、更新されたリストを外側のマップに再追加する必要があります。最後に、外側のマップが完全に埋め込まれたら、キー(合計)に対してCollectionsソートメソッドを実行できます。次に、別のforループを実行して、ソートされた項目を希望の形式で印刷します。

私はあなたの目的を達成するための複雑なアプローチを提案していることを知っています。しかし、解決策が見つからなければ、このアプローチを試すことができます。もし私がさらに助けになることができたら教えてください。もしデータに読んでいる部分(及びコンソールへ印刷)について

+0

'Map 'を実行する方が簡単です(存在しない場合は 'new double [2]を作成し、名前の下に追加してください)。見つかった二重配列の合計を必要に応じて増やします。複雑さの軽減。 – KevinO

+0

@KevinO、この地図のキーは何ですか? "項目名"?はいの場合は、「アイテム数」はどうですか?また、どのように並べ替えが行われますか?少し説明できますか? – VHS

+0

はい、アイテム名はキー、数量は倍[0]、合計は倍[1]です。私は、重複したエントリを持つファイルを読み込んで、指定されたエントリの合計金額を集めることがポイントであると仮定しています(たとえば、複数のSuburuセールスがあり、目標はすべてのセールスを蓄積することです;少し不明)。ポイントが単なるすべての行を読み込んで並べ替えるのであれば、解決策は少し違うでしょう。次に、マップから、Map.Entryセットを処理します。 – KevinO

0

私が考えることができるもう少し複雑な解決策は、java.lang.Comparableインターフェイスを実装する "SalesData"という新しいクラスを定義することです。例えば。 public class SalesData implements Comparable<SalesData>。このクラスには3つのメンバーフィールドがあります:1.商品名2.数量3.合計販売。 compareToメソッドをこのクラスに追加します。これは、2つのSalesDataオブジェクトの比較を「合計売り上げ」フィールドに基づいてのみ行うことができます。 forループでは、データを印刷するのではなく、このデータを使用してSalesDataクラスのオブジェクトを作成します。すべての行を読み終えると、 "SalesData"オブジェクトのリストが表示されます。次に、このリストのCollections.sortを呼び出すことができます。ソートでは、SalesDataクラスのcompareToメソッドを使用してソートを行います。並べ替えが完了したら、目的の形式でデータを印刷できます。私がもっと情報を提供できるかどうか教えてください。

+0

また、OPはコメントで、「私はArrayListを使用することができません。通常の配列とbubblesort' –

+0

これは補遺ではありませんでした。それは別の答えでした。また、問題の説明のどこにも、彼はArrayListを使用することを許可されていないと言われています。彼がArrayListを使用することを許可されていないとしても、彼はCopyOnWriteArrayListのような代替Listオブジェクトを使うことができます。私の意図は、概念的な解決策を提供することでした。 – VHS

関連する問題