import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class algo {
public static void main(String[] args) {
String[] participant = {"leo", "kiki", "eden"};
String[] completion = {"eden", "kiki"};
solution(participant, completion);
}
public static class MarathonInfo {
String[] participants;
String[] completions;
HashMap<String, Integer> marathonDetailInfo = new HashMap<>();
public MarathonInfo(String[] participants, String[] completions, HashMap<String, Integer> marathonInfo) {
this.participants = participants;
this.completions = completions;
this.marathonDetailInfo = marathonInfo;
}
}
public static void calculateParticipantNum(MarathonInfo marathonInfo) {
Arrays.stream(marathonInfo.participants).forEach((participant) -> {
int curParticipantNum = marathonInfo.marathonDetailInfo.getOrDefault(participant, 0);
marathonInfo.marathonDetailInfo.put(participant, curParticipantNum + 1);
});
}
public static void calculateNoCompleParticipantNum(MarathonInfo marathonInfo) {
Arrays.stream(marathonInfo.completions).forEach((completion) -> {
int curParticipantNum = marathonInfo.marathonDetailInfo.get(completion);
int completionParticipantNum = 1;
marathonInfo.marathonDetailInfo.put(completion, curParticipantNum - completionParticipantNum);
});
}
public static String getNoCompletionParticipant(MarathonInfo marathonInfo) {
calculateNoCompleParticipantNum(marathonInfo);
return marathonInfo.marathonDetailInfo.entrySet()
.stream()
.filter(part -> part.getValue() > 0)
.map(part -> part.getKey())
.collect(Collectors.joining());
}
public static String solution(String[] participants, String[] completions) {
MarathonInfo marathonInfo = new MarathonInfo(participants, completions, new HashMap<>());
calculateParticipantNum(marathonInfo);
return getNoCompletionParticipant(marathonInfo);
}
}