質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

javaでcsvファイルの値を利用して計算したい(その他もある)

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,387

score 6

実現したいこと

1 Program の PutPrice Method で、金額が5個の固定になっているが、CSVFile から値を読む形にする。個数は、任意とする。

2 Display 上に、左半分と右半分に2つの Text 表示領域を作成して、左側には、元の Data、右側には出力の Data を表示する。

3 2 の表示で、左半分の表示領域に、「開く」「開始」「終了」のボタンを作成する。「開 く」ボタンで、元値 File を選択し、左の表示領域に表示する。「開始」ボタンで、計算を始め、結果を右側 の表示領域に表示する。「終了」ボタンで Program を終了する。

4 表示領域を一つにして、「開く」「開始」「終了」ボタンを作成する。「開く」ボタンで、元値 File を選択し、表示領域に表示する。「開始」ボタンで、出力 File を設定し、計算を始め、結果を画面に 表示すると同時に出力ファイルを作成する。「終了」ボタンで Program を終了する。

発生している問題・エラーメッセージ

色々探してみてCSVfileの値を読み込んでカンマ区切りで配列に格納する方法なのかと思い試してみたんですがどれもエラーがでて上手くいかずどうして良いかわからなくなってしまいました。とりあえず実現したいことの1をできるようになりたいです。まだプログラム初心者でヒントや参考になるサイトなどがあれば教えて欲しいです。

該当のソースコード

CalculatePrice.javaファイル

class CalculatePrice {
private int workArea;
private boolean available = false;

//synchronized指定。pricePutメソッドが終了するまで、
//メソッドが属するオブジェクトはアクセスされない
public synchronized void pricePut(int price) {
while (available == true) {
try {
wait();  //availableがtrueの間、wait
} catch (InterruptedException e) {
}
}
//workAreaに値をセットする処理
workArea = price;
available = true;
//availableにtrueを代入した後wait状態のスレッドを解除
notifyAll();
}

//synchronized指定。priceGetメソッドが終了するまで、
//メソッドが属するオブジェクトはアクセスされない
public synchronized void priceGet() {
while (available == false) {
try {
wait();  //availableがfalseの間、wait
} catch (InterruptedException e) {
}
}
//workAreaから値を抜出す処理
System.out.println("課税後価格は" +
workArea * 1.05 + "円です。");
available = false;
//availableにfalseを代入した後wait状態のスレッドを解除
notifyAll();
}
}

PutPrice.javaファイル

class PutPrice extends Thread {
private CalculatePrice cp;
private int[ ] price = {100, 200, 300, 400, 500};

//コンストラクタ内で引数に指定されたオブジェクトcpを代入
public PutPrice(CalculatePrice cp) {
this.cp = cp;
}

public void run() {
for (int i = 0; i < 5; i++) {
//オブジェクトcpのpricePutメソッドを実行
cp.pricePut(price[i]);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
}

GetPrice.javaファイル

class GetPrice extends Thread {
private CalculatePrice cp;
//コンストラクタ内で引数に指定されたオブジェクトcpを代入
public GetPrice(CalculatePrice cp) {
this.cp = cp;
}

public void run() {
for (int i = 0; i < 5; i++) {
//オブジェクトcpのpriceGetメソッドを実行
cp.priceGet();
}
}
}

ExThread5.javaファイル

public class ExThread5 {
public static void main(String[] args) {
CalculatePrice cp = new CalculatePrice();
//オブジェクトcpを引数にスレッドオブジェクトppの生成
PutPrice pp = new PutPrice(cp);
//オブジェクトcpを引数にスレッドオブジェクトgpの生成
GetPrice gp = new GetPrice(cp);

pp.start();  //スレッドを実行可能状態にする
gp.start();  //スレッドを実行可能状態にする
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • umyu

    2017/04/28 13:58

    まず、コードを一切修正せずに現状のプログラムの動作を理解してください。消費税の算出から推測ですが、http://www.javaroad.jp/java_thread4.htm このサイトのコードを流用したと思われます。

    キャンセル

  • umyu

    2017/04/28 14:19

    ・PutPrice/GetPriceクラスのrunメソッドにて for (int i = 0; i < 5; i++) とCalculatePriceから暗黙的に渡される要素数を5と仮定しています。 そのため、ファイルを読み込む処理以外にループの終了条件も変更しないといけません。 以下は確認ですが Producer-Consumerパターンなので、BlockingQueueを使用するのはダメなのですか?

    キャンセル

  • 退会済みユーザー

    2017/04/29 23:45

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

+1

Javaには標準でCSVを読み書きするライブラリが用意されていません。実現したいことに書いてあるCSVFileというのが一体何を示しているのかわからないと何をしたいのかがわかりません。ソースコードにはCSVFileというのが一つも無いため、推測が全くできません。

CSVでフォーマットされたファイルを読み込むことを表すとしても、多くの問題があります。

  • CSVの読み書きする標準ライブラリがないため、CSVのライブラリを用意するか、CSVを読み込むクラスを独自に作成する必要があります。CSVのライブラリは数多く存在し、どれを採用するかで書き方も変わってきます。
  • CSVと単純に標準規格(RFC4180)に準拠している場合もあれば、独自の場合もあります。改行はCR+LFなのかLFのみなのか?,が含まれるフィールドは"で囲むのか?では、"が含まれるフィールドは""と二つ並べることでエスケープするのか?\でのエスケープはできるのか?そもそも文字コードはUTF-8かWindows-31J(日本語環境Excelの標準)か?全角カンマ","もフィールド区切りと見なすか?フィールドに改行を含めることができるか?など、多数の実装があります。どこまで対応するかによって、ライブラリの選択や、オプション等が変わってきます。
  • CSVのフィールドはどのように書き込まれるのでしょうか?例えば、最初のレコードはヘッダであり、無視すべきかも知れません。逆に、最初レコードにすべて価格が全て載っているかも知れません。各レコードは「製品,価格,税率」かも知れません。また、価格の単位も1円単位とは限らず、千円単位だったり、3.14を3円14銭として計算すべきかも知れません。千二百五十二円と漢数字で書いてある可能性すら有ります。どのようにレコードがあって、どの部分を取り出すのかわからなければ、何を実装すべきかがわかりません。
  • サイドに、そのCSVファイルはどこにあるのでしょうか?ファイルのパスをどうやって決めるのかがわからなければ、ファイルを読み込むことすらできません。

以上のことから、1.を解決するには、まず、詳細を確認することです。CSVFileとは何を表すのか、CSVファイルを読み込むことだとしても、CSVファイルはどんな形式でどのように価格が書き込まれているのか、また、そのファイルはどうやって見つければ良いのか、そういった点がわからなければどうしようもありません。それがわかって、次に、CSVライブラリの選定、または、独自にCSV読み込みクラスを作るのかが決まります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る