特定の文字列を含むデータの表示【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