2020. 12. 12. 12:31ㆍJava/live-study
과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
- 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
- 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
- Github 자바 라이브러리를 사용하면 편리합니다.
- 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.
실행 결과
ParticipationCalculator 코드
필드
// github의 정보들을 가져오기 위한 api
private final GitHub github;
// 누구의 repository이며 어떤 repository의 dash board임을 알려주기위한 필드들
private String repoAddress;
private String owner;
private String repositoryName;
// 참여율 계산에 필요한 이슈의 개수, 각 이슈 별 참여자 집합, 참여자 별 참여 횟수 필드
private int numberOfIssues;
private Set<String> participants = new HashSet<>();
private Map<String, Integer> numberOfParticipationByParticipant = new HashMap<>();
생성자
public ParticipationCalculator() throws IOException {
github = new GitHubBuilder().fromPropertyFile().build();
}
Github
의 객체는 한번의 초기화만 해도 된다고 생각하여 ParticipationCalculator
객체가 생성될 때 동시에 생성하게 했습니다.
run()
public void run() {
Scanner scanner = new Scanner(System.in);
System.out.println("스터디 repository 주소를 입력하세요. ex) whiteship/live-study");
System.out.print("주소 입력: ");
repoAddress = scanner.nextLine();
setOwner(repoAddress);
setRepositoryName(repoAddress);
printParticipantRate();
}
run()
메서드는 사용자가 참여율을 계산할 study repository를 입력받는 메소드입니다.
study repository를 입력 받고 owner
필드와 repositoryName
필드를 초기화했습니다.
printParticipationRate()
private void printParticipationRate() {
System.out.println(repositoryName+" dash board");
numberOfParticipationByParticipant = calculateNumberOfParticipation();
numberOfParticipationByParticipant.forEach(
(participant, numberOfParticipation) -> {
double rate = calculateRate(numberOfParticipation);
System.out.println(participant+"의 참여율: " + String.format("%.2f", rate)+"%");
});
}
printParticipationRate()
는 repository의 issue 참여율을 출력하는 메서드입니다.
calculateNumberOfParticipation()
메서드로 참여자 별 참여 횟수를 구한 뒤 calculateRate
메서드로 참여율을 구했습니다.
참여율은 String.format()
으로 소숫점 두자리까지 출력하도록 했습니다.
calculateNumberOfParticipation()
private Map<String, Integer> calculateNumberOfParticipation() {
List<GHIssue> issues = new ArrayList<>();
try {
issues = github.getRepository(repoAddress).getIssues(GHIssueState.ALL);
numberOfIssues = issues.size();
} catch(IOException e) {
e.printStackTrace();
}
issues.forEach(issue -> {
participants = getParticipants(issue);
participants.forEach(participant -> {
Integer numberOfParticipation = numberOfParticipationByParticipant.getOrDefault(participant, 0)+1;
numberOfParticipationByParticipant.put(participant, numberOfParticipation);
});
});
calculateNumberOfParticipation()
메서드는 참여율을 제공하는 메서드입니다.
이슈는 상태와 상관 없이 모두 불러왔으며 getParticipants(GHIssue issue)
메서드로 각 이슈 별 참여자 집합을 구했습니다. 이 때 참여율 계산에 필요한 이슈 개수를 초기화시켰습니다.
참여자 집합을 순회하며 numberOfParticipationByParticipant
에 있는참여자의 참여 횟수를 증가시켰습니다.
getParticipants(GHIssue issue)
private Set<String> getParticipants(GHIssue issue) {
String issueAuthor = "";
try {
issueAuthor = issue.getUser().getLogin();
} catch(IOException e) {
e.printStackTrace();
}
if(!issueAuthor.equals(owner)) return new HashSet<>();
List<GHIssueComment> comments = new ArrayList<>();
try {
comments = issue.getComments();
} catch(IOException e) {
e.printStackTrace();
}
for(GHIssueComment comment : comments) {
String participant = "";
try {
participant = comment.getUser().getLogin();
} catch(IOException e) {
e.printStackTrace();
}
if (!participant.equals(owner)) {
participants.add(participant);
}
}
return participants;
}
getParticipants(GHIssue issue)
는 각 이슈 별 참여자 집합을 제공하는 메서드입니다.
이슈의 댓글들을 구하기 전에 이슈를 포스트한 사람이 repository이 주인인지를 확인하여 그렇지 않은 경우 빈 집합을 돌려주도록 했습니다.
이슈의 댓글들을 순회하면서도 repository의 주인은 집합에 포함되지않도록 했습니다.
calculateRate(Integer numberOfParticipants)
private double calculateRate(Integer numberOfParticipants) {
return numberOfParticipants*1.0 / numberOfIssues * 100;
}
calculateRate(Integer numberOfParticipants)
은 참여율을 제공하는 메서드입니다. 파라미터로 참여자의 참여횟수가 필요합니다.
'Java > live-study' 카테고리의 다른 글
4. 제어문에 대해 알아보자 (0) | 2020.12.12 |
---|