package baseball;
public class BattingVO {
private String PlayId;
private String year;
private String teamId;
private String lgId;
/**
* 2루타
*/
private int doubleHits;
/**
* 3루타
*/
private int tripleHits;
/**
* 볼넷
*/
private int bb;
/**
* 홈런
*/
private int hr;
/**
* 삼진
*/
private int so;
//TeamVO를 추가
private TeamVO teamVO;
public BattingVO() {
}
public BattingVO(String[] battingArrayData) {
this.PlayId = battingArrayData[0];
this.year = battingArrayData[1];
this.teamId = battingArrayData[3];
this.lgId = battingArrayData[4];
this.doubleHits = NumberUtil.parseInt(battingArrayData[9],0);
this.tripleHits = NumberUtil.parseInt(battingArrayData[10],0);
this.hr = NumberUtil.parseInt(battingArrayData[11],0);
this.bb = NumberUtil.parseInt(battingArrayData[15],0);
if (battingArrayData.length < 17) {
this.so = 0;
} else {
this.so = NumberUtil.parseInt(battingArrayData[16],0);
}
}
public String getPlayId() {
return PlayId;
}
public void setPlayId(String playId) {
PlayId = playId;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getTeamId() {
return teamId;
}
public void setTeamId(String teamId) {
this.teamId = teamId;
}
public String getLgId() {
return lgId;
}
public void setLgId(String lgId) {
this.lgId = lgId;
}
public int getDoubleHits() {
return doubleHits;
}
public void setDoubleHits(int doubleHits) {
this.doubleHits = doubleHits;
}
public int getTripleHits() {
return tripleHits;
}
public void setTripleHits(int tripleHits) {
this.tripleHits = tripleHits;
}
public int getBb() {
return bb;
}
public void setBb(int bb) {
this.bb = bb;
}
public int getHr() {
return hr;
}
public void setHr(int hr) {
this.hr = hr;
}
public int getSo() {
return so;
}
public void setSo(int so) {
this.so = so;
}
protected TeamVO getTeamVO() {
return teamVO;
}
protected void setTeamVO(TeamVO teamVO) {
this.teamVO = teamVO;
}
}
package baseball;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class BaseballStream {
public Stream<BattingVO> readBattingCSVFile(){
File battingFile = new File("C:\\Users\\User\\Desktop\\baseballdatabank-master\\core","Batting.csv");
//파일을 스트림으로 읽어온다.
try {
return Files.lines(battingFile.toPath())
.parallel() //스트림을 병렬로 변경(병렬스트림은 정렬을 보장하지 못한다.)
.skip(3)
.map((line)->new BattingVO(line.split(",")));
} catch (IOException e) {
// TODO Auto-generated catch block
return Stream.empty();
}
}
public static void main(String[] args) {
BaseballStream bs = new BaseballStream();
//csv내의 모든 파일 내용을 출력
bs.readBattingCSVFile()
.forEach(batting->{
// System.out.println("PlayerID "+batting.getPlayId());
// System.out.println("Year- "+batting.getYear());
// System.out.println("TeamId "+batting.getTeamId());
// System.out.println("LgId "+batting.getLgId());
// System.out.println("DoubleHits "+batting.getDoubleHits());
// System.out.println("TripleHits "+batting.getTripleHits());
// System.out.println("Bb "+batting.getBb());
// System.out.println("Hr "+batting.getHr());
// System.out.println("So "+batting.getSo());
// System.out.println("-".repeat(50));
});
//2.csv내의 모든 PlayerID만 조회하는데, PlayerID를 오름차순 정렬해서 출력
bs.readBattingCSVFile()
.map(BattingVO::getPlayId)
.distinct() //정렬 연산의 비용이 크므로 정렬 전 중복데이터를 모두 제거한다.
.sorted() //정렬한다(기본 오름차순)
.forEach(System.out::println);
System.out.println("==============================");
//3.csv내의 모든 PlayerID만 조회하는데, PlayerID를 내림차순 정렬해서 출력
bs.readBattingCSVFile()
.map(BattingVO::getPlayId)
.distinct() //정렬 연산의 비용이 크므로 정렬 전 중복데이터를 모두 제거한다.
// .sorted((batting1,batting2)->batting1.compareTo(batting2)) //오름차순 정렬한다
.sorted((batting1,batting2)->batting2.compareTo(batting1)) //내림차순 정렬한다
.forEach(System.out::println);
//4. 홈런을 31개보다 적게 친 선수들의 정보를 홈런의 개수로 오름차순 정렬해 출력
bs.readBattingCSVFile()
.filter((batting)->batting.getHr()<31)
.sorted((batting1,batting2)->batting1.getHr()-batting2.getHr())
.forEach(batting->{
System.out.println("PlayerID "+batting.getPlayId());
System.out.println("Year- "+batting.getYear());
System.out.println("TeamId "+batting.getTeamId());
System.out.println("LgId "+batting.getLgId());
System.out.println("DoubleHits "+batting.getDoubleHits());
System.out.println("TripleHits "+batting.getTripleHits());
System.out.println("Bb "+batting.getBb());
System.out.println("Hr "+batting.getHr());
System.out.println("So "+batting.getSo());
System.out.println("-".repeat(50));
});
//5. 홈런을 31개보다 적게 친 선수들은 몇명인지 구하기
long hrPlayerCount = bs.readBattingCSVFile()
.filter((batting)->batting.getHr()<31)
.count();
System.out.println(hrPlayerCount);
System.out.println("=========================================================================================================");
//6.2022년에 볼넷을 가장 많이 당한선수 5명 조회하기
bs.readBattingCSVFile()
.filter((batting)->batting.getYear().equals("2022"))
.sorted((batting1,batting2)->batting2.getBb()-batting1.getBb())
.limit(5)
.forEach(batting->{
System.out.println("PlayerID "+batting.getPlayId());
System.out.println("Year- "+batting.getYear());
System.out.println("TeamId "+batting.getTeamId());
System.out.println("LgId "+batting.getLgId());
System.out.println("DoubleHits "+batting.getDoubleHits());
System.out.println("TripleHits "+batting.getTripleHits());
System.out.println("Bb "+batting.getBb());
System.out.println("Hr "+batting.getHr());
System.out.println("So "+batting.getSo());
System.out.println("-".repeat(50));
});
System.out.println("=========================================================================================================");
//7. 2022년에 홈런을 한번이라도 친 선수중 아무나 한명 조회하기
BattingVO bat =
bs.readBattingCSVFile()
.filter((batting)->batting.getYear().equals("2022") && batting.getHr()>=1)
.findAny()
.orElse(new BattingVO());
System.out.println("PlayerID "+bat.getPlayId());
System.out.println("Year- "+bat.getYear());
System.out.println("TeamId "+bat.getTeamId());
System.out.println("LgId "+bat.getLgId());
System.out.println("DoubleHits "+bat.getDoubleHits());
System.out.println("TripleHits "+bat.getTripleHits());
System.out.println("Bb "+bat.getBb());
System.out.println("Hr "+bat.getHr());
System.out.println("So "+bat.getSo());
System.out.println("-".repeat(50));
System.out.println("==============<><>><><>><><><>===========================================================================================");
//woodswi01 이선수가 출전해 2루타를 한번이라도 친 경기연도를 내림차순으로 정렬해 조회(병렬스트림)
bs.readBattingCSVFile()
.filter((batting)->batting.getPlayId().equals("yastrmi01") && batting.getDoubleHits()>0)
.collect(Collectors.toList())
.stream()
.sorted((b1,b2)->b2.getYear().compareTo(b1.getYear()))
.forEach(batting->{
System.out.println("PlayerID "+batting.getPlayId());
System.out.println("Year- "+batting.getYear());
System.out.println("TeamId "+batting.getTeamId());
System.out.println("LgId "+batting.getLgId());
System.out.println("DoubleHits "+batting.getDoubleHits());
System.out.println("TripleHits "+batting.getTripleHits());
System.out.println("Bb "+batting.getBb());
System.out.println("Hr "+batting.getHr());
System.out.println("So "+batting.getSo());
System.out.println("-".repeat(50));
});
//9. 홈런, 2루타, 3루타, 볼넷, 삼진데이터가 모두 0보다 큰 선수들의 선수 아이디만
//내림차순 정렬해 조회한다.(선수아이디만 조회되어야 함);
// bs.readBattingCSVFile()
// .filter((batting)->batting.getHr()>0 &&
// batting.getDoubleHits()>0 &&
// batting.getTripleHits()>0 &&
// batting.getBb()>0 &&
// batting.getSo()>0)
// .map(BattingVO::getPlayId) //PlayId만 출력해줄려면 꼭 map을 해줘야한다
// .collect(Collectors.toList()) //병렬 스트림이여서 사용해줌
// .stream()
// .distinct()
// .sorted((b1,b2)->b2.compareTo(b1))
// .forEach(System.out::println);
}
}
실습 1과 같음
package baseball;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;
public class BaseballStream2 {
public Stream<BattingVO> readBattingCSVFile(){
File battingFile = new File("C:\\Users\\User\\Desktop\\baseballdatabank-master\\core","Batting.csv");
//파일을 스트림으로 읽어온다.
try {
return Files.lines(battingFile.toPath())
.parallel() //스트림을 병렬로 변경(병렬스트림은 정렬을 보장하지 못한다.)
.skip(3)
.map((line)->new BattingVO(line.split(",")));
} catch (IOException e) {
// TODO Auto-generated catch block
return Stream.empty();
}
}
public Stream<TeamVO> readTeamCSVFile(){
File battingFile = new File("C:\\Users\\User\\Desktop\\baseballdatabank-master\\core","TeamsFranchises.csv");
//파일을 스트림으로 읽어온다.
try {
return Files.lines(battingFile.toPath())
.parallel() //스트림을 병렬로 변경(병렬스트림은 정렬을 보장하지 못한다.)
.skip(1)
.map((line)->new TeamVO(line.split(",")));
} catch (IOException e) {
// TODO Auto-generated catch block
return Stream.empty();
}
}
public void stream1( ) {
//1.모든 플레이어들의 정보와 팀 명을 조회.s
//배팅플레이어 = Batting.csv
//팀=TeamFranchiese.csv
this.readBattingCSVFile()
.map(batting->{
String teamId=batting.getTeamId();
String teamName= this.readTeamCSVFile() // <-- Stream
.filter(team->team.getFranchId().equals(teamId))
.map(TeamVO::getFranchName)
.findFirst()
.orElse("Unknown");
TeamVO teamVO=new TeamVO();
teamVO.setFranchId(teamId);
teamVO.setFranchName(teamName);
batting.setTeamVO(teamVO);
return batting;
})
.forEach(batting->{
System.out.println(batting.getTeamId());
System.out.println(batting.getTeamVO().getFranchName());
});
}
public void stream2( ) {
//2.Boston Red Sox 팀에서 2022년에 활동한 서수들의 아이디를 조회
this.readTeamCSVFile()
.filter(team -> team.getFranchName().equals("Boston Red Sox"))
.flatMap(team->{
return this.readBattingCSVFile()
.filter(batting-> batting.getTeamId().equals(team.getFranchId()))
.filter(batting-> batting.getYear().equals("2022"));
})
.map(BattingVO::getPlayId)
.forEach(System.out::println);
System.out.println("====================================================================");
}
public void stream3() {
//Arizona Diamondbacks 팀 소속을 제외한 모든 선수들의 ID만 중복없이 조회
this.readTeamCSVFile()
.filter(team->!team.getFranchName().equals("Arizona Diamondbacks"))
.flatMap(team->{
return this.readBattingCSVFile()
.filter(bat->bat.getTeamId().equals(team.getFranchId()));
})
.map(BattingVO::getPlayId)
.distinct()
.forEach(System.out::println);
}
public static void main(String[] args) {
BaseballStream2 bs=new BaseballStream2();
// bs.stream2();
bs.stream3();
}
}
package wiki;
public class WikiVO {
private String id;
private String title;
private String desc;
public WikiVO() {}
public WikiVO(String id, String title, String desc) {
this.id = id;
this.title = title;
this.desc = desc;
}
protected String getId() {
return id;
}
protected void setId(String id) {
this.id = id;
}
protected String getTitle() {
return title;
}
protected void setTitle(String title) {
this.title = title;
}
protected String getDesc() {
return desc;
}
protected void setDesc(String desc) {
this.desc = desc;
}
}
package wiki;
import java.io.File;
import java.nio.file.Files;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WikiStream {
public Stream<WikiVO> readContentsFile(){
String path="C:\\Users\\User\\Desktop\\data";
String fileName="10K.ID.CONTENTS";
File file = new File(path, fileName);
try {
return Files.lines(file.toPath())
.parallel()
.map(line ->{
String[] lineArray= line.split("\t");
String id=lineArray[0].trim();
String content="";
if(lineArray.length==2) {
content=lineArray[1].trim();
}
WikiVO wikiVO=new WikiVO(id,"",content);
return wikiVO;
});
} catch (Exception e) {
return Stream.empty();
}
}
public void stream1() {
long count=this.readContentsFile()
.count();
System.out.println(count);
}
public void stream2() {
this.readContentsFile()
.forEach(wiki->{
System.out.println(wiki.getDesc());
});
}
public void stream3() {
this.readContentsFile()
.filter(wiki-> wiki.getDesc().length()>0)
.forEach(wiki->{
System.out.println(wiki.getDesc());
});
}
public void stream4() {
//모든 위키 내용에서 몇개의 영단어가 사용되었는지 확인.
long wordCount=this.readContentsFile()
.map(WikiVO::getDesc) //내용만 주출
.map(desc->desc.replaceAll("[^a-zA-Z]"," "))// 영문자를 제외한 나머지는 " "로변경
//문장을 " "으로 자른다.
//단어를 가진 스트림으로 변경한다.
.flatMap(desc->Stream.of(desc.split(" ")))
// 모든 단어를 소문자로 변경한다.
.map(word->word.toLowerCase())
//단어의 길이가 1개 이상인것만 가져온다
.filter(word->word.length()>1)
//디버깅용(추출된 단어를 미리 출력해본다)
.peek(System.out::println)
//중복된 단어는 제거한다.
.distinct()
.count();
System.out.println(wordCount);
}
public void stream5() {
//문장의 길이가 100글자 이상인것들만 모아 List로 변경한다.
List<WikiVO> wikiList=
this.readContentsFile()
.filter(wiki-> wiki.getDesc().length()>=100)
.collect(Collectors.toList());
for(WikiVO wikiVO: wikiList) {
System.out.println(wikiVO.getId()+" > ");
System.out.println(wikiVO.getDesc());
}
}
public void stream6() {
//3글자 이상의 단어들만 추출해서 List로 변경한다
List<String> wikiList= this.readContentsFile()
.map(WikiVO::getDesc) //내용만 주출
.map(desc->desc.replaceAll("[^a-zA-Z]"," "))// 영문자를 제외한 나머지는 " "로변경
//문장을 " "으로 자른다.
//단어를 가진 스트림으로 변경한다.
.flatMap(desc->Stream.of(desc.split(" ")))
// 모든 단어를 소문자로 변경한다.
.map(word->word.toLowerCase())
//단어의 길이가 1개 이상인것만 가져온다
.filter(word->word.length()>3)
//중복된 단어는 제거한다.
.distinct()
.collect(Collectors.toList());
for(String String: wikiList) {
System.out.println(String);
}
}
public void stream7() {
//3글자 이상의 단어들 중 A로 시작하는(대소문자 관계없이) 단어만 주출해서 List로 변경한다.
List<String> wikiList= this.readContentsFile()
.map(WikiVO::getDesc) //내용만 주출
.map(desc->desc.replaceAll("[^a-zA-Z]"," "))// 영문자를 제외한 나머지는 " "로변경
//문장을 " "으로 자른다.
//단어를 가진 스트림으로 변경한다.
.flatMap(desc->Stream.of(desc.split(" ")))
//단어의 길이가 1개 이상인것만 가져온다
.filter(word->word.length()>3)
//중복된 단어는 제거한다.
.distinct()
.collect(Collectors.toList());
for(String String: wikiList) {
if(String.startsWith("a") || String.startsWith("A")) {
System.out.println(String);
}
}
}
public void stream8() {
//내용이 없는 문서의 번호만
this.readContentsFile()
.filter(wiki->wiki.getDesc().length()<=0);
}
public void stream9() {
//내용이 없는 문서의 제목을 추출해서 출력한다.
}
public static void main(String[] args) {
WikiStream ws= new WikiStream();
// ws.stream3();
// ws.stream5();
ws.stream7();
}
}