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

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

ただいまの
回答率

89.09%

Java テキストファイルから正規表現でマッチした商品名と価格を抜き出し合計金額を算出

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,825
退会済みユーザー

退会済みユーザー

前提・実現したいこと

ここに質問したいことを詳細に書いてください
度々恐れ入ります。
掲題の件について、Javaで実装を行ったところ以下のエラーが返ってきてしまいました。
基本的な文法ができていないのは重々承知ですが、改善点や、ご指摘を頂けると幸いです。

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

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    到達不能コード

    at traning.Test.main(Test.java:36)

該当のソースコード

package traning;

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test{            

            public static void main(String[] args) {                

                //自インスタンス生成
                Test test = new Test();

                //引数の確認    
                if (args.length != 1) {
                    System.out.println("引数を指定してください");
                    return;
                }

                //パスオブジェクトをgetメソッドで作成
                Path path = Paths.get(args[0]);
                if(!Files.exists(path));{
                    System.out.println("ファイルが開けないか存在しません。");
                    return;
                }

                //ファイル読込
                List<String> list;
            try{                
                list = Files.readAllLines(path,Charset.forName("SJIS"));

                }catch( IOException e ) {
                    e.printStackTrace();
                    System.out.println("ファイルパスが正しくありません");
                    return;
                }    

            /*データ抽出呼び出し*/
            List<String> ProductList = rac.ExtractProduct(list);
            List<Integer> PriceList = rac.ExtractPrice(list);

            /*商品名と価格画面表示*/
            for(int count = 0; count<PriceList.size();count++){
                System.out.print(ProductList.get(count) + "は");
                System.out.println(PriceList.get(count)+ "円");
            }

            int total = test.totalAmount(PriceList);

            }        

            List<String> ExtractProduct(List<String> list){
                List<String> ProductList = new ArrayList<String>();
                //商品名抽出
                for (int i = 0; i<list.size(); i++){
                String regexProductName = "\\[(.+)\\]";
                Pattern patternProduct = Pattern.compile(regexProductName);
                Matcher matchProduct = patternProduct.matcher(list.get(i));
                if(matchProduct.find()){
                    ProductList.add(matchProduct.group(0));
                //抽出不可
                }else{
                    ProductList.add(null);
                    }
                }
                return ProductList;

            }                        
                List<Integer> ExtractPrice (List<String> list){
                    List<Integer> PriceList = new ArrayList<Integer>();                
                    //価格抽出
                    for (int j = 0; j<list.size(); j++){
                    String regexPriceName = "\\\\(\\d+)";                        
                    Pattern pattrenPrice = Pattern.compile(regexPriceName);
                    Matcher matchPrice = pattrenPrice.matcher(list.get(j).toString());
                    if(matchPrice.find()){
                        PriceList.add(Integer.parseInt(matchPrice.group(1)));
                    //抽出不可
                    }else{
                        PriceList.add(0);
                    }


                }
                    return PriceList;
                }    

                /*合計金額算出処理*/
                int totalAmount(List<Integer> PriceList){        
                    int total =0;
                    for(int k =0; k<PriceList.size(); k++){
                    total += PriceList.get(k);    
                }                
                System.out.println("合計金額は"+total+"円です");                        

                return total; 


            }
}

補足情報(言語/FW/ツール等のバージョンなど)

言語:Java 環境:eclipse Neon

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

やりたいことを1度にやり過ぎてる気がします。

ゴール【テキストファイルから正規表現でマッチした商品名と価格を抜き出し合計金額を算出】

・・・なんですが、まず標準出力に hallo world を出すだけメインメソッドを実装したのクラスを
作成、コンパイル、実行はできますでしょうか。

KaiShoyaさんもおっしゃっていますが、{}で囲まれたブロックの概念から必要かと。

細かく分けてください。理解しているなら全部できるかとおもいます。
1.ハードコーディングのパス名で定義された、テキストファイルを読み込むだけのクラスを作成、コンパイル、実行
2.ハードコーディングのパス名で定義された、テキストファイルを文字列として読み込んで標準出力に出すクラスの作成、コンパイル、実行
3.ハードコーディングの文字列に対して、正規表現でパターンマッチの結果を標準出力に出すクラスの作成、コンパイル、実行
4.文字列を数値に変換し、計算するクラスの作成、コンパイル、実行
5.テキストファイルを文字列として読み込んで、読み込んだ文字列に対するパターンマッチングを行うクラスの作成、コンパイル、実行
6.上記1~5を組み合わせて、ゴールを目指す。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/08 13:44

    回答ありがとうございます。メソッドの概要が出来ていないことが分かりました。

    キャンセル

0

main関数外に大量に処理が書いてあるのですが、カッコの位置が間違っていませんか?

  public static void main(String[] args) {
    Test tes = new Test();    
    if (args.length != 1) {
      System.out.println("ファイルが開けないか存在しません。");
      return;
    }
  }
  Path Path = Paths.get(args[0]);{

このreturnもおかしいです。

    List<Integer> PriceExtraction (List<Integer> list){
      List<Integer> PriceList = new ArrayList<Integer>();
      for (int j = 0; j<list.size(); j++){
        String regexPriceName = "\\d+";                    

        Pattern pattrenPrice = Pattern.compile(regexPriceName);
        Matcher matchPrice = pattrenPrice.matcher(list.get(j).toString());
        if(matchPrice.find()){
          PriceList.add(Integer.parseInt(matchPrice.group(1)));
        }else{
          PriceList.add(null);
          System.err.println("抽出不可");
        }

      }

      return PriceList;

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/08 13:46

    ご指摘、ご回答ありがとうございます。メソッドを分けて書きなおします。

    キャンセル

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

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