kristina7

НП - Лаб 6-3 Администрација на чет-систем

Jan 3rd, 2019
861
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.28 KB | None | 0 0
  1. /*
  2. Треба да се развие класа за администрација на чет‐систем(chat). Системот се состои од повеќе чет‐соби, објекти од класата ChatRoom. Во ChatRoom ги чуваме името на собата и имињата на корисниците кои тековно се наоѓаат во таа соба (за корисниците да се користи соодветен Set).
  3.  
  4. ChatRoom(String name) ‐ креира нова празна соба за чет (празна значи без корисници).
  5. addUser(String username) - го додава корисникот со тоа име во собата.
  6. removeUser(String username) - го отстранува корисникот со тоа име од собата доколку има таков, во спротивно не прави ништо.
  7. toString():String - враќа стринг кои ги содржи името на собата и сите корисници кои се во собата секој одделен со нов ред. Корисниците се подредени алфабетски. Ако собата е празна се враќа името на собата во еден ред, а во вториот ред стрингот "EMPTY" (наводници само за појаснување).
  8. hasUser(String username):boolean - враќа true ако постои корисник со тоа име во собата.
  9. numUsers():int - го враќа бројот на корисници во собата.
  10. Главната  класа ChatSystem  ги  содржи  сите  соби  и  сите  орисници. Корисниците може да се членови на една, повеќе или да не се членови на ниедна соба. За менаџмент на собите треба да ги понудите следните три методи:
  11.  
  12. addRoom(String roomName) - додава нова празна соба во листата на соби.
  13. removeRoom(String roomName) - ја отстранува собата од листата.
  14. getRoom(String roomName):ChatRoom - го враќа објектот кој ја претставува собата со име roomName. Фрлете NoSuchRoomException(roomName) доколку не постои соба со тоа име.
  15. Забелешка: Собите чувајте ги во TreeMap за да бидат секогаш подредени по нивното име.
  16.  
  17. Дополнително во класата ChatSystem постојат следните методи за работа со корисниците:
  18.  
  19. ChatSystem() - default constructor
  20. register(String userName) - го регистрира корисникот во системот. Го додава во собата со најмалку корисници. Доколку има повеќе такви соби тогаш го додава во првата соба по лексикоргафско подредување.
  21. registerAndJoin(String userName, String roomName) - го регистрира корисникот во системот. Дополнително го додава во собата со име roomName.
  22. joinRoom(String userName, String roomName) - го  додава  корисникот  во  собата  со соодветно  име  доколку  таа  постои,  во  спротивно  фрла  исклучок  од  типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
  23. leaveRoom(String username, String roomName) - го отстранува корисникот од собата со соодветно  име  доколку  таа  постои.  во  спротивно  фрла  исклучок  од  типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
  24. followFriend(String username, String friend_username) – корисникот со име username го приклучува во сите соби во кој е член корисникот со име friendUsername. Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
  25. */
  26.  
  27. import java.lang.reflect.InvocationTargetException;
  28. import java.lang.reflect.Method;
  29. import java.util.Scanner;
  30. import java.util.Set;
  31. import java.util.TreeSet;
  32. import java.util.stream.Collectors;
  33. import java.util.Comparator;
  34. import java.util.LinkedList;
  35. import java.util.Map;
  36. import java.util.TreeMap;
  37. import java.util.TreeSet;
  38.  
  39. class ChatRoom {
  40.     String name;
  41.     Set<String> users;
  42.  
  43.     public ChatRoom(String name) {
  44.         this.name = name;
  45.         this.users = new TreeSet<>();
  46.     }
  47.  
  48.     public void addUser(String userName) {
  49.         users.add(userName);
  50.     }
  51.  
  52.     public void removeUser(String userName) {
  53.         users.remove(userName);
  54.     }
  55.  
  56.     public boolean hasUser(String userName) {
  57.         return users.contains(userName);
  58.     }
  59.  
  60.     @Override
  61.     public String toString() {
  62.         StringBuilder sb = new StringBuilder();
  63.         sb.append(name + "\n");
  64.         if (users.isEmpty())
  65.             sb.append("EMPTY");
  66.         else
  67.             sb.append(users.stream().collect(Collectors.joining("\n")));
  68.         sb.append("\n");
  69.         return sb.toString();
  70.     }
  71.  
  72.     public int numUsers() {
  73.         return users.size();
  74.     }
  75. }
  76.  
  77. class ChatSystem {
  78.     Map<String, ChatRoom> rooms;
  79.     TreeSet<String> users;
  80.  
  81.     public ChatSystem() {
  82.         rooms = new TreeMap<>();
  83.         users = new TreeSet<>();
  84.     }
  85.  
  86.     public void addRoom(String roomName) {
  87.         rooms.put(roomName, new ChatRoom(roomName));
  88.     }
  89.  
  90.     public void removeRoom(String roomName) {
  91.         rooms.remove(roomName);
  92.     }
  93.  
  94.     public ChatRoom getRoom(String roomName) throws NoSuchRoomException {
  95.         if (!rooms.containsKey(roomName))
  96.             throw new NoSuchRoomException(roomName);
  97.         return rooms.get(roomName);
  98.     }
  99.  
  100.     public void register(String userName) throws NoSuchRoomException, NoSuchUserException {
  101.         users.add(userName);
  102.         if (!rooms.isEmpty()) {
  103.             String min = rooms.values().stream()
  104.                     .min(Comparator.comparing(ChatRoom::numUsers).thenComparing(room -> room.name)).get().name;
  105.             registerAndJoin(userName, min);
  106.         }
  107.  
  108.     }
  109.  
  110.     public void registerAndJoin(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  111.         users.add(userName);
  112.         joinRoom(userName, roomName);
  113.     }
  114.  
  115.     public void joinRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  116.         if (!rooms.containsKey(roomName))
  117.             throw new NoSuchRoomException(roomName);
  118.         if (!users.contains(userName))
  119.             throw new NoSuchUserException(userName);
  120.         rooms.get(roomName).addUser(userName);
  121.  
  122.     }
  123.  
  124.     public void leaveRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  125.         if (!rooms.containsKey(roomName))
  126.             throw new NoSuchRoomException(roomName);
  127.         if (!users.contains(userName))
  128.             throw new NoSuchUserException(userName);
  129.         rooms.get(roomName).removeUser(userName);
  130.     }
  131.  
  132.     public void followFriend(String userName, String friend_username) throws NoSuchUserException {
  133.         if (!users.contains(friend_username))
  134.             throw new NoSuchUserException(friend_username);
  135.         rooms.values().stream().filter(room -> room.hasUser(friend_username)).forEach(room -> room.addUser(userName));
  136.     }
  137.    
  138. }
  139.  
  140. class NoSuchRoomException extends Exception {
  141.     public NoSuchRoomException(String roomName) {
  142.         super("No such room " + roomName);
  143.     }
  144. }
  145.  
  146. class NoSuchUserException extends Exception {
  147.     public NoSuchUserException(String userName) {
  148.         super("No such user " + userName);
  149.     }
  150. }
  151.  
  152. public class ChatSystemTest {
  153.  
  154.     public static void main(String[] args)
  155.             throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchRoomException {
  156.         Scanner jin = new Scanner(System.in);
  157.         int k = jin.nextInt();
  158.         if (k == 0) {
  159.             ChatRoom cr = new ChatRoom(jin.next());
  160.             int n = jin.nextInt();
  161.             for (int i = 0; i < n; ++i) {
  162.                 k = jin.nextInt();
  163.                 if (k == 0)
  164.                     cr.addUser(jin.next());
  165.                 if (k == 1)
  166.                     cr.removeUser(jin.next());
  167.                 if (k == 2)
  168.                     System.out.println(cr.hasUser(jin.next()));
  169.             }
  170.             System.out.println("");
  171.             System.out.println(cr.toString());
  172.             n = jin.nextInt();
  173.             if (n == 0)
  174.                 return;
  175.             ChatRoom cr2 = new ChatRoom(jin.next());
  176.             for (int i = 0; i < n; ++i) {
  177.                 k = jin.nextInt();
  178.                 if (k == 0)
  179.                     cr2.addUser(jin.next());
  180.                 if (k == 1)
  181.                     cr2.removeUser(jin.next());
  182.                 if (k == 2)
  183.                     cr2.hasUser(jin.next());
  184.             }
  185.             System.out.println(cr2.toString());
  186.         }
  187.         if (k == 1) {
  188.             ChatSystem cs = new ChatSystem();
  189.             Method mts[] = cs.getClass().getMethods();
  190.             while (true) {
  191.                 String cmd = jin.next();
  192.                 if (cmd.equals("stop"))
  193.                     break;
  194.                 if (cmd.equals("print")) {
  195.                     System.out.println(cs.getRoom(jin.next()) + "\n");
  196.                     continue;
  197.                 }
  198.                 for (Method m : mts) {
  199.                     if (m.getName().equals(cmd)) {
  200.                         String params[] = new String[m.getParameterTypes().length];
  201.                         for (int i = 0; i < params.length; ++i)
  202.                             params[i] = jin.next();
  203.                         m.invoke(cs, params);
  204.                     }
  205.                 }
  206.             }
  207.         }
  208.     }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment