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

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

特定の文字列を含むデータの表示【Java】

プログラムの詳細

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

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

解決したいこと

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

該当するソースコード

Main.java
package qiita;

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

public class Main {
	public static String input = null;
	public static Scanner scanner;
	public static Scanner scan;
	public static final String ONE = "1";
	public static final String TWO = "2";
	public static final String THREE = "3";

	/**
	 * CSVファイルのデータを表示するプログラム。
	 * データには名前、住所、電話番号、年齢の4項目を持っている。
	 * 
	 * 下記1〜3の機能を持つ
	 * 1,CSVファイルのデータ全て表示する。
	 * 2,CSVファイルのデータから検索文字列を含むデータのみを表示する。
	 * 3,プログラムを終了する。
	 * 
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		//インスタンス生成
		DataDisplayProcess dataDisplayProcess = new DataDisplayProcess();

		//「1(表示)」又は「2(検索)」機能を選択した場合、各機能の実行終了後にメニュー画面を繰り返し表示
		while (!(THREE.equals(input))) {

			//menuメソッドの呼び出し
			input = menu();

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

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

				//dataLoadStoreメソッドの呼び出し
				List<PersonalDataStore> list = dataDisplayProcess.dataLoadStore();

				//displayメソッドの呼び出し
				dataDisplayProcess.display(list);

			} else if (TWO.equals(input)) {
				//「2(検索)」機能。CSVファイルのデータから検索文字列を含むデータのみを表示する。

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

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

				//dataLoadStoreメソッドの呼び出し
				List<PersonalDataStore> list = dataDisplayProcess.dataLoadStore();

				//インスタンス生成
				Search search = new Search();

				//searchメソッドの呼び出し
				search.search(list, strSearch);
			}
		}
		scanner.close();
		scan.close();

		//「3,終了」機能。プログラムの終了。
		System.out.println("3,終了");
		System.out.println("プログラムを終了します…");
	}

	/**
	 * メニュー画面
	 * 全角数字「1〜3」のみの入力値を受け付ける。
	 * 
	 * @return input
	 */
	public static String menu() {
		//メニュー一覧
		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.next();

		//入力値チェック
		if (!(input.equals(ONE) || input.equals(TWO) || input.equals(THREE))) {
			System.out.println("全角数字1~3以外の文字/数字が入力されています。もう一度やり直して下さい…");

		}
		//入力値が「1〜3」の場合の処理
		return input;
	}
}
DataDisplayProcess.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 DataDisplayProcess {

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

	/**
	 * dataLoadStoreメソッド
	 * CSVファイルのデータを読み込み、PersonalDataStoreにデータを入れる。
	 * 
	 * @return list
	 */
	public List<PersonalDataStore> dataLoadStore() throws IOException {

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

		// CSVファイル読み込み
		csvList = Files.readAllLines(PATH);

		//インスタンス生成
		ArrayList<PersonalDataStore> list = new ArrayList<>();

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

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

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

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

	/**
	 * displayメソッド
	 * CSVファイルのデータを表示。
	 * 
	 * @param list
	 */
	public void display(List<PersonalDataStore> list) {

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


public class PersonalDataStore {

	//名前
	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 {

	/**
	 * searchメソッド
	 * PersonalDataStoreのデータを取り出して、「名前」に部分一致するものを表示
	 * @param list, searchWord
	 */
	public void search(List<PersonalDataStore> list, String searchWord) {

		// PersonalDataStoreのデータを取り出して、部分一致するデータを全て表示
		for (PersonalDataStore b : list) {
			if (b.getName().indexOf(searchWord) != -1) {
				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

やりたいこと:Search#searchで抽出したリストを返すようにしたい
ということだと理解しました

public class Search {

	/**
	 * searchメソッド
	 * PersonalDataStoreのデータを取り出して、「名前」に部分一致するものを返却
	 * @param list, searchWord
	 */
	public List<PersonalDataStore> search(List<PersonalDataStore> list, String searchWord) {

		// PersonalDataStoreのデータを取り出して、部分一致するデータを抽出
        return list.stream().filter(b -> b.getName().indexOf(searchWord) != -1).collect(Collectors.toList());
	}
}

listをstream(リストの中身を順番に処理する構造)にして、filter(条件に一致するもののみに抽出する)してcollect(特定のデータ形式にまとめる)します。
データ形式はCollectors.toList()でList形式を指定します。

1Like

Your answer might help someone💌