Stream

GW·2023년 8월 1일

Baseball파일 받아와서 Stream실습1

VO

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);
	}
	
	
	
}

Baseball파일 받아와서 Stream실습2

VO

실습 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();
	}

}

wiki파일 받아와서 Stream실습1

VO

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();
		
	}
}

0개의 댓글