티스토리 뷰

즉, 검색 콘솔 창에서 검색 조건과 내용을 입력하면 제시한 조건에 해당하는 데이터를 추출하여, excel파일과 HTML 파일로 저장하라는 문제다.

첫 구현은 

1. 데이터를 한글로 변환

2. 조건이 2개 이상일 때 두 조건의 and연산 

을 제외하고 잘 구현을 시켰으나, 이 두가지가 정말 시간이 많이 들어가는 작업이었다. 알고 있는 검색 알고리즘을 어떻게 해야 효율적으로 사용할 수 있을 지 잘 생각이 안나서, 그냥 죄다 일일이 비교하여 검색을 진행하였다. 

 

우선,

1. 데이터를 한글로 변환

 이 작업은 무한 else if문을 사용하여 구현하려고 했으나 강사님이 정말 효율적인 방법을 제시해주어 그걸 사용하였다.

 

Code:

package com.choonham.util;

public class EnglishToHangul {

	private String eng = "";
	private String han = "";
	
	public EnglishToHangul() {
		// TODO Auto-generated constructor stub
	}

	public EnglishToHangul(String eng, String han) {
		this.eng = eng;
		this.han = han;
	}
	

	public String getEng() {
		return eng;
	}

	public String getHan() {
		return han;
	}
	
}

 우선, 다음과 같이 한글과 영문 값을 가질 객체를 만들어 준 뒤에 

package com.choonham.data;

import java.util.ArrayList;

import com.choonham.util.EnglishToHangul;

public class DataClass {

	public static ArrayList<EnglishToHangul> us_kr_job = new ArrayList<>();
	public static ArrayList<EnglishToHangul> us_kr_marital = new ArrayList<>();
	public static ArrayList<EnglishToHangul> us_kr_housing = new ArrayList<>();
	public static ArrayList<EnglishToHangul> us_kr_loan = new ArrayList<>();
	public static ArrayList<EnglishToHangul> us_kr_contact = new ArrayList<>();


	public static ArrayList<CustomerClass> customerList = new ArrayList<>();
	public static ArrayList<CustomerClass> outputList = new ArrayList<>();
	
	public DataClass() {
	}
	
	public static void translationData() {
		us_kr_job.add(new EnglishToHangul("admin.", "관리"));
		us_kr_job.add(new EnglishToHangul("blue-collar", "노동"));
		us_kr_job.add(new EnglishToHangul("entrepreneur", "사업"));
		us_kr_job.add(new EnglishToHangul("housemaid", "가정부"));
		us_kr_job.add(new EnglishToHangul("management", "경영"));
		us_kr_job.add(new EnglishToHangul("retired", "은퇴"));
		us_kr_job.add(new EnglishToHangul("self-employed", "자영업"));
		us_kr_job.add(new EnglishToHangul("services", "서비스"));
		us_kr_job.add(new EnglishToHangul("student", "학생"));
		us_kr_job.add(new EnglishToHangul("technician", "기술자"));
		us_kr_job.add(new EnglishToHangul("unemployed", "실직"));
		us_kr_job.add(new EnglishToHangul("unknown", "모름"));
		
		us_kr_marital.add(new EnglishToHangul("divorced", "이혼"));
		us_kr_marital.add(new EnglishToHangul("married", "기혼"));
		us_kr_marital.add(new EnglishToHangul("single", "미혼"));
		
		us_kr_housing.add(new EnglishToHangul("no", "없음"));
		us_kr_housing.add(new EnglishToHangul("unknown", "모름"));
		us_kr_housing.add(new EnglishToHangul("yes", "소유"));
		
		us_kr_loan.add(new EnglishToHangul("no", "없음"));
		us_kr_loan.add(new EnglishToHangul("unknown", "모름"));
		us_kr_loan.add(new EnglishToHangul("yes", "소유"));

		us_kr_contact.add(new EnglishToHangul("cellular", "휴대폰"));
		us_kr_contact.add(new EnglishToHangul("telephone", "집전화"));
	}
	
	
}

전체 데이터를 가질 DataClass에서 위와 같이 EnglishToHangul 객체의 리스트를 만들어 단어장을 생성해준다. 다음으로 

package com.choonham.data;

import java.util.ArrayList;

import com.choonham.util.EnglishToHangul;

public class CustomerClass extends BankClass{
	
	private int age;
	private String job; 
	private String marital;
	private String housing;
	
	
	public CustomerClass() {
		// TODO Auto-generated constructor stub
	}
	
	public CustomerClass(String age, String job, String marital, String housing, String loan, String contact, String duration) {
		super(usToKr(loan, DataClass.us_kr_loan), usToKr(contact, DataClass.us_kr_contact), duration);
		this.age = Integer.parseInt(age);
		this.job = usToKr(job, DataClass.us_kr_job);
		this.marital = usToKr(marital, DataClass.us_kr_marital);
		this.housing = usToKr(housing, DataClass.us_kr_housing);
	}
	
	private static String usToKr(String word, ArrayList<EnglishToHangul> en_kr_list) {
		String kr = "";
		for(EnglishToHangul en : en_kr_list) {
			if(word.equals(en.getEng())) {
				kr =  en.getHan();
			}
		}
		return kr;
	}

각 단어와 단어장을 인자로 받아 영문에 맞는 한글을 반환해주는 usToKr 메서드를 생성해주면 간단하게 영문을 한글로 변환하여 Data 객체에 넣어줄 수 있다.

 

2. 조건이 2개 이상일 때 두 조건의 and연산  

 단순한 검색 메서드를 만들어, 검색 조건의 갯수만큼 반복문을 돌리고, 입력 받은 조건과 내용을 직접 비교하여 반환하는 코드를 작성했다. 하지만 아무 생각 없이 Data클래스의 outputList에 add만 시켜주니 조건을 2개 이상 주었을 때, and연산으로 반환하는 것이 아닌 or 즉, 하나의 조건이라도 맞으면 리스트에 들어가 버리는 대참사가 발생했다...

이를 수정하기 위해,

@Override
	public void getSearchResult(ArrayList<String> searchCondition, ArrayList<String> searchInput) {
		for (int i = 0; i < searchCondition.size(); i++) {
			if (searchCondition.get(i).equals("age")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getAge() == Integer.parseInt(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = 0; n <  DataClass.outputList.size(); n++) {
						if (DataClass.outputList.get(n).getAge() != Integer.parseInt(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			}
public static void delete(int i) {
		DataClass.outputList.remove(i);
	}

이와 같이 작성을 했었는데....이렇게 하면 결과 리스트가 아예 엉뚱하게 나왔다. 이 delete함수도 ArrayList.remove 자체의 문제가 있는 줄 알고 혹시나 하는 마음으로 작성을 했으나... 계속해서 엉뚱한 정답이 나왔다.

한참을 고민하다가 문득, remove를 사용하여 리스트 한 줄을 지워버리는데 인덱스가 계속 동일하게 증가하니, 삭제가 되는 순간 순서가 꼬인다는 사실을 깨우쳤다... ㅎㅎ 사실 언젠가 배웠던 개념인데...머리 속에서 사라져 있었다.

그래서 재수정...

@Override
	public void getSearchResult(ArrayList<String> searchCondition, ArrayList<String> searchInput) {
		for (int i = 0; i < searchCondition.size(); i++) {
			if (searchCondition.get(i).equals("age")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getAge() == Integer.parseInt(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (DataClass.outputList.get(n).getAge() != Integer.parseInt(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("job")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getJob().equals(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
					System.out.println(DataClass.outputList.size());
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (!DataClass.outputList.get(n).getJob().equals(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("marital")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getMarital().equals(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (!DataClass.outputList.get(n).getMarital().equals(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("housing")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getHousing().equals(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (!DataClass.outputList.get(n).getHousing().equals(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("loan")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getLoan().equals(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (!DataClass.outputList.get(n).getLoan().equals(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("contact")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getContact().equals(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (!DataClass.outputList.get(n).getContact().equals(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			} else if (searchCondition.get(i).equals("duration")) {
				if (i == 0) {
					for (CustomerClass cc : DataClass.customerList) {
						if (cc.getDuration() == Integer.parseInt(searchInput.get(i))) {
							DataClass.outputList.add(cc);
						}
					}
				} else {
					for (int n = DataClass.outputList.size() - 1; n >= 0; n--) {
						if (DataClass.outputList.get(n).getDuration() != Integer.parseInt(searchInput.get(i))) {
							delete(n);
						}
					}
				}
			}
		}
	}

 결과는 아주 만족스럽게 잘 나왔다.

Output:

 

검색을 시작하시려면 "검색" 을 입력하세요.
검색
검색 조건을 입력하세요. (검색을 종료하시려면, end를 입력하세요.)
age: 18 ~ 120
job: 관리, 노동, 사업, 가정부, 경영, 은퇴, 자영업, 서비스, 학생, 기술자, 실직, 모름
marital: 기혼, 미혼, 이혼
housing: 없음, 소유, 모름
loan: 없음, 소유, 모름
contact: 휴대폰, 집전화
duration: 7 ~ 2062
age
내용을 입력하세요.
18
검색 조건을 입력하세요. (검색을 종료하시려면, end를 입력하세요.)
age: 18 ~ 120
job: 관리, 노동, 사업, 가정부, 경영, 은퇴, 자영업, 서비스, 학생, 기술자, 실직, 모름
marital: 기혼, 미혼, 이혼
housing: 없음, 소유, 모름
loan: 없음, 소유, 모름
contact: 휴대폰, 집전화
duration: 7 ~ 2062
job
내용을 입력하세요.
학생
검색 조건을 입력하세요. (검색을 종료하시려면, end를 입력하세요.)
age: 18 ~ 120
job: 관리, 노동, 사업, 가정부, 경영, 은퇴, 자영업, 서비스, 학생, 기술자, 실직, 모름
marital: 기혼, 미혼, 이혼
housing: 없음, 소유, 모름
loan: 없음, 소유, 모름
contact: 휴대폰, 집전화
duration: 7 ~ 2062
end

 

입력을 마쳤을 때, 

위와 같이 18살에 학생인 사람의 정보만 출력되었다. ^오^~

끝!

 

프로젝트의 깃허브 주소:

github.com/Choonham/Choonham-2020.03.10-Spring-Class/tree/master/bank_data_test_nyj

 

Choonham/Choonham-2020.03.10-Spring-Class

Contribute to Choonham/Choonham-2020.03.10-Spring-Class development by creating an account on GitHub.

github.com

끝!

Comments