emily-08
@emily-08 (えみり)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

特定の文字列を含むデータの表示。

解決したいこと

Searchクラスのsearch()で、データの抽出のみを行い、抽出したデータのリストを返却するような処理に現状のソースを修正させたいです。
また、Mainクラスのmain() 側でリストを受け取り、DataDisplayProcessクラスのdisplay() に抽出したデータを引き渡してデータ表示させたいと思っています。
ご教示お願い致します。

プログラムの詳細

CSVファイルのデータを表示するプログラムを作っています。
データには名前、住所、電話番号、年齢の4項目を持っています。

下記1〜3の機能があります。Mainクラスにて1~3のいずれかの整数を入力すれば、機能が実装できるようにしています。
1,CSVファイルのデータ全て表示する。
2,CSVファイルのデータから名前に検索文字列を含むデータのみを表示する。
3,プログラムを終了する。

該当するソースコード

Main.java
package qiita;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;

public class Main {
	static int input;
	static Scanner scanner;
	static Scanner scan;

	public static void main(String[] args) throws IOException {

		//「1(表示)」又は「2(検索)」機能を選択した場合、各機能の実行終了後にメニュー画面を繰り返し表示
		while (input != 3) {
			//menuメソッドの呼び出し
			input = menu();
			DisplayProcess displayProcess = new DisplayProcess();

			//各機能の処理
			if (input == 1) {
				//「1(表示)」機能。CSVのデータをすべて表示。

				System.out.println("1,表示");

				try {
					//dataLoadStoreメソッドの呼び出し
					List<Store> list = displayProcess.dataLoadStore();
					//displayメソッドの呼び出し
					displayProcess.display(list);
				} catch (FileNotFoundException e) {
					System.out.println(e);
				}
			} else if (input == 2) {
				//「2(検索)」機能。CSVファイルのデータから検索文字列を含むデータのみを表示する。

				System.out.println("2,検索");

				//標準入力受付用オブジェクト
				System.out.println("検索文字列を入力してください…");
				scan = new Scanner(System.in);//インスタンス生成
				String strSearch = scan.next();

				try {
					//dataLoadStoreメソッドの呼び出し
					List<Store> list = DisplayProcess.dataLoadStore();
					//searchメソッドの呼び出し
					Search.display(list, strSearch);
				} catch (FileNotFoundException i) {
					i.printStackTrace();
					return;
				}
			}
		}
		scanner.close();//
		scan.close();//
		//「3,終了」機能。プログラムの終了。
		System.out.println("3,終了");
		System.out.println("プログラムを終了します…");
	}

	public static int menu() {

		int input;

		//メニュー一覧
		System.out.println();
		System.out.println("************メニュー一覧************");
		System.out.println(" 1,表示      2,検索      3,終了");
		System.out.println("************************************");

		//標準入力受付用オブジェクト
		System.out.println("1,2,3いずれかの数字を半角で入力してください…");
		scanner = new Scanner(System.in);
		input = scanner.nextInt();

		//入力値チェック
		if (!(input == 1 || input == 2 || input == 3)) {
			System.out.println("半角数字1~3以外の文字/数字が入力されています。もう一度やり直して下さい…");
			//入力値が「1〜3」以外の場合、メニュー画面を繰り返す
			menu();
		}

		//入力値が「1〜3」の場合の処理
		return input;
	}
}
DisplayProcess.Java
package qiita;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class DisplayProcess {

	// CSVファイルのパス
	public static final Path PATH = Paths.get("./employee.csv");

	List<Store> dataLoadStore() throws IOException {

		// 読み込んだCSVファイルの情報を格納するリスト
		List<String> csvList = new ArrayList<>();

		csvList = Files.readAllLines(PATH);

		ArrayList<Store> list = new ArrayList<>();

		//CSVファイルの情報を格納したリスト分繰り返し
		for (String rows : csvList) {

			//カンマ区切りの配列を作成
			String[] rowArray = rows.split(",");

			//インスタンス生成
			Store bean = new Store();

			//Storeにデータを入れる
			bean.setName(rowArray[0]);
			bean.setAddress(rowArray[1]);
			bean.setTel(rowArray[2]);
			bean.setAge(rowArray[3]);
			list.add(bean);
		}
		return list;
	}

	void display(List<Store> list) {

		// Storeのデータを取り出して表示
		for (Store b : list) {
			System.out.println("[" + b.getName() + "][" + b.getAddress() + "][" + b.getTel() + "][" + b.getAge() + "]");
		}
	}
}
Store.java
package qiita;

public class Store {

	//名前
	private String name;
	//住所
	private String address;
	//電話番号
	private String tel;
	//年齢
	private String age;

	/**
	 * getNameメソッド
	 * 名前を取得
	 * @return name 名前
	 */
	public String getName() {
		return name;
	}
	/**
	 * setNameメソッド
	 * 名前を設定
	 * @param name 名前
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * getAddressメソッド
	 * 住所を取得
	 * @return address 住所
	 */
	public String getAddress() {
		return address;
	}
	/**
	 * setAddressメソッド
	 * 住所を設定
	 * @param address 住所
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/**
	 * getTelメソッド
	 * 電話番号を取得
	 * @return tel 電話番号
	 */
	public String getTel() {
		return tel;
	}
	/**
	 * setTelメソッド
	 * 電話番号を設定
	 * @param tel 電話番号
	 */
	public void setTel(String tel) {
		this.tel = tel;
	}

	/**
	 * getAgeメソッド
	 * 年齢を取得
	 * @return age 年齢
	 */
	public String getAge() {
		return age;
	}
	/**
	 * setAgeメソッド
	 * 年齢を設定
	 * @param age 年齢
	 */
	public void setAge(String age) {
		this.age = age;
	}
}
Search.java
package qiita;

import java.util.List;

public class Search {

	public static void display(List<Store> list, String searchWord) {

		// Storeのデータを取り出して表示
		for (Store b : list) {
			System.out.println("[" + b.getName() + "][" + b.getAddress() + "][" + b.getTel() + "][" + b.getAge() + "]");
		}
	}
}
employee.csv
名前, 住所 ,  電話番号  ,年齢,
中田,東京都,00-3333-3333,25,
長友,東京都,00-2222-2222,25,
森保,東京都,03-1234-5678,25,
川島,福島県,00-1111-1111,30,
吉田,福島県,00-0000-0000,30,
中村,福島県,00-9999-9999,30,
三浦,栃木県,99-9999-9999,40,
久保,栃木県,00-9999-9990,40,
三苫,石川県,99-9999-9999,40,
長谷部,長野県,00-9999-0000,40
0

1Answer

  • 現状はどのような問題がありますか?

  • また、以下の行は変数とクラスの頭文字は全部大文字になっているのは多分コンバインエラーでしょうと思います。

DisplayProcess DisplayProcess = new DisplayProcess();
0Like

Comments

  1. @emily-08

    Questioner

    ご教示ありがとうございます。
    変数名は変更致しました。

    現状エラーにはならないかとは思いますが、機能を再利用してシンプルに書くことが求められましたので今回質問させて頂きました。
    また、特定の文字列を含むデータを表示させようとしています。

    その上で、下記のような条件で作成したいと考えております。
    Searchクラスのsearch()で、データの抽出のみを行い、抽出したデータのリストを返却するような処理にすること。
    また、Mainクラスのmain() 側でリストを受け取り、DataDisplayProcessクラスのdisplay() に抽出したデータを引き渡してデータ表示させる。

  2. 「再利用」というと、つまり汎用性かと思います。

    • まず、CSVファイル名を固定ではなく、mainのパラメータとして受け取るようにします。
    • CSV列可変にしたら、もっと便利になるかと思います。この場合、Store.javaではなく、HashMapでデータを格納します。
    • どの列を利用するか、列番号をmainから受け取るようにします。

    こうすれば、汎用性がすこしずつアップになるでしょうと思います。ご参考まで。

    あるいみで、いままでプログラムに記載された「定数」をパラメータに切り替えるやり方と見えます。

Your answer might help someone💌