Advertisement
Guest User

Untitled

a guest
Mar 7th, 2018
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.87 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.*;
  5. import java.util.List;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. import java.util.stream.Collectors;
  9.  
  10. public class Ex04ForceBook {
  11.     static class ForceUser {
  12.         private String forceUser;
  13.         private String forceSide;
  14.  
  15.         public ForceUser(String forceUser, String forceSide) {
  16.             this.forceUser = forceUser;
  17.             this.forceSide = forceSide;
  18.         }
  19.  
  20.         public String getForceUser() {
  21.             return forceUser;
  22.         }
  23.  
  24.         public void changeForceSide(String forceSide) {
  25.             this.forceSide = forceSide;
  26.             System.out.println(String.format("%s joins the %s side!", this.forceUser, this.forceSide));
  27.         }
  28.  
  29.         public String getForceSide() {
  30.             return forceSide;
  31.         }
  32.  
  33.         @Override
  34.         public String toString() {
  35.             return String.format("! %s", this.forceUser);
  36.         }
  37.     }
  38.  
  39.     private static List<ForceUser> forceUsers;
  40.     private static Pattern sideUserPattern = Pattern.compile("(?<forceSide>.+)\\s+\\|\\s+(?<forceUser>.+)");
  41.     private static Pattern changeSidePattern = Pattern.compile("(?<forceUser>.+)\\s+->\\s+(?<forceSide>.+)");
  42.  
  43.     public static void main(String[] args) throws IOException {
  44.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  45.         forceUsers = new ArrayList<>();
  46.  
  47.         String input;
  48.         while (! "Lumpawaroo".equals(input = reader.readLine())) {
  49.             Matcher sideUserMatcher = sideUserPattern.matcher(input);
  50.             Matcher changeSideMatcher = changeSidePattern.matcher(input);
  51.             Optional<ForceUser> forceUserOptional;
  52.  
  53.             if (sideUserMatcher.find()) {
  54.                 String forceUser = sideUserMatcher.group("forceUser");
  55.                 String forceSide = sideUserMatcher.group("forceSide");
  56.                 forceUserOptional = getForceUser(forceUser);
  57.                 if (! forceUserOptional.isPresent()) {
  58.                     forceUsers.add(new ForceUser(forceUser, forceSide));
  59.                 }
  60.             }
  61.  
  62.             if (changeSideMatcher.find()) {
  63.                 String forceUser = changeSideMatcher.group("forceUser");
  64.                 String forceSide = changeSideMatcher.group("forceSide");
  65.                 forceUserOptional = getForceUser(forceUser);
  66.                 if (forceUserOptional.isPresent()) {
  67.                     forceUsers.stream().filter(e -> e.getForceUser().equals(forceUser))
  68.                             .forEach(u -> u.changeForceSide(forceSide));
  69.                 } else {
  70.                     forceUsers.add(new ForceUser(forceUser, forceSide));
  71.                     System.out.println(String.format("%s joins the %s side!", forceUser, forceSide));
  72.                 }
  73.             }
  74.         }
  75.  
  76.         Map<String, List<ForceUser>> result =
  77.                 forceUsers.stream().collect(Collectors.groupingBy(ForceUser::getForceSide));
  78.  
  79.         result.entrySet().stream()
  80.                 .filter(s -> s.getValue().size() > 0)
  81.                 .sorted((s1, s2) -> {
  82.                     int index = Integer.compare(s2.getValue().size(), s1.getValue().size());
  83.                     return (index != 0) ? index : s1.getKey().compareTo(s2.getKey());
  84.                 })
  85.                 .forEach(s -> {
  86.                     System.out.println(String.format("Side: %s, Members: %d", s.getKey(), s.getValue().size()));
  87.                     s.getValue().stream()
  88.                             .sorted(Comparator.comparing(ForceUser::getForceUser))
  89.                             .forEach(System.out::println);
  90.                 });
  91.     }
  92.  
  93.     private static Optional<ForceUser> getForceUser(String forceUser) {
  94.         return forceUsers.stream().filter(e -> e.getForceUser().equals(forceUser)).findAny();
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement