728x90
이 내용은 다른 블로그에 있는 걸 거의 그대로 베껴서 코드가 동작하는 걸 확인해보고 적어둔다.
문제
//member.csv 파일 일부
이름, 취미, 소개
김프로, 축구:농구:야구, 구기종목 좋아요
정프로, 개발:당구:족구, 개발하는데 뛰긴 싫어
앙몬드, 피아노, 죠르디가 좋아요 좋아좋아너무좋아
죠르디, 스포츠댄스:개발, 개발하는 죠르디
정미애, 노래:스포츠댄스:개발, 이선희 모창가수 좋아요
|
1. CSV 파일을 읽어서 취미별 인원수를 구하라.
2. CSV 파일을 읽어서 취미별 정씨성을 가진 멤버 수를 구하라.
3. CSV 파일을 읽어서 소개 내용에 '좋아'가 몇번 등장하는 지 카운트하라.
코드 구현 예제
import java.io.*;
import java.util.*;
public class StreamEX6 {
public static void main(String[] args) {
// 코드 출처 : https://jeong-pro.tistory.com/212 (동작하는 코드로 작성)
StreamEX6 st = new StreamEX6();
st.printMemberCountGroupByHobby();
System.out.println("======================");
st.printMemberCountGroupByJeongMember();
System.out.println("======================");
st.printLikeCount();
}
public void printMemberCountGroupByHobby() { // 취미별 인원수 구하기
List<List<String>> members = readCSV();
members.remove(0); //첫줄 제거
//System.out.println(members); // 출력하여 확인
Map<String, Integer> result = new HashMap<>(); //결과를 담을 해시맵 구성
members.stream()
.flatMap(line -> Arrays.stream(line.get(1).replace(" ","").split(":")))
//.peek(s->System.out.printf("hobby=%s%n",s))
.forEach(hobby -> result.merge(hobby, 1, (oldValue, newValue)->++oldValue));
//출력
result.entrySet().forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue()));
}
public void printMemberCountGroupByJeongMember(){ // 취미별 정씨 성을 갖는 멤버 수
List<List<String>> members = readCSV();
members.remove(0); //첫줄 제거
//System.out.println(members);
Map<String, Integer> result = new HashMap<>(); //결과를 담을 해시맵 구성
members.stream()
.filter(line->line.get(0).startsWith("정"))
.flatMap(line -> Arrays.stream(line.get(1).replace(" ","").split(":")))
//.peek(s->System.out.printf("hobby=%s%n",s))
.forEach(hobby -> result.merge(hobby, 1, (oldValue, newValue)->++oldValue));
//출력
result.entrySet().forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue()));
}
public void printLikeCount(){ // 소개 내용에 '좋아'가 몇번 등장하는지 구하기
List<List<String>> members = readCSV();
members.remove(0); // 첫줄 제거
//System.out.println(members);
final String word = "좋아";
int result = members.stream()
.map(line -> countFindString(line.get(2),word))
.reduce(0,Integer::sum);
// 출력
System.out.println(word + " " + result);
}
private int countFindString(String source, String target){
int idx = source.indexOf(target);
if(idx == -1){
return 0;
} else {
return 1 + countFindString(source.substring(idx+1), target);
}
}
public static List<List<String>> readCSV() {
List<List<String>> csvList = new ArrayList<List<String>>();
File csv = new File("c:\\Workspace\\Java\\StreamEX\\src\\members.csv"); // 절대 경로
BufferedReader reader = null;
String line = "";
try {
reader = new BufferedReader(new FileReader(csv));
while ((line = reader.readLine()) != null) { // readLine()은 파일에서 개행된 한 줄의 데이터를 읽어온다.
List<String> tmpList = new ArrayList<String>();
String[] lineArr = line.split(","); // 파일의 한 줄을 ,로 나누어 배열에 저장 후 리스트로 변환한다.
tmpList = Arrays.asList(lineArr); // 배열을 리스트로 변환
csvList.add(tmpList);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close(); // 사용 후 BufferedReader를 닫아준다.
}
} catch(IOException e) {
e.printStackTrace();
}
}
//System.out.println(csvList); // 읽어들인 파일의 리스트 확인
return csvList;
}
}
|
728x90
'안드로이드 > Java 문법' 카테고리의 다른 글
[java] Wrapper Class (0) | 2021.11.18 |
---|---|
[Java ] Stream 예제 (0) | 2021.11.15 |
[Java] Generics 예제1 (2) | 2021.11.10 |
HashMap 예제 (0) | 2021.10.30 |
[Java] HashSet 를 이용한 ArrayList 중복제거 및 정렬 (0) | 2020.12.12 |