Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Треба да се развие класа за администрација на чет‐систем(chat). Системот се состои од повеќе чет‐соби, објекти од класата ChatRoom. Во ChatRoom ги чуваме името на собата и имињата на корисниците кои тековно се наоѓаат во таа соба (за корисниците да се користи соодветен Set).
- ChatRoom(String name) ‐ креира нова празна соба за чет (празна значи без корисници).
- addUser(String username) - го додава корисникот со тоа име во собата.
- removeUser(String username) - го отстранува корисникот со тоа име од собата доколку има таков, во спротивно не прави ништо.
- toString():String - враќа стринг кои ги содржи името на собата и сите корисници кои се во собата секој одделен со нов ред. Корисниците се подредени алфабетски. Ако собата е празна се враќа името на собата во еден ред, а во вториот ред стрингот "EMPTY" (наводници само за појаснување).
- hasUser(String username):boolean - враќа true ако постои корисник со тоа име во собата.
- numUsers():int - го враќа бројот на корисници во собата.
- Главната класа ChatSystem ги содржи сите соби и сите орисници. Корисниците може да се членови на една, повеќе или да не се членови на ниедна соба. За менаџмент на собите треба да ги понудите следните три методи:
- addRoom(String roomName) - додава нова празна соба во листата на соби.
- removeRoom(String roomName) - ја отстранува собата од листата.
- getRoom(String roomName):ChatRoom - го враќа објектот кој ја претставува собата со име roomName. Фрлете NoSuchRoomException(roomName) доколку не постои соба со тоа име.
- Забелешка: Собите чувајте ги во TreeMap за да бидат секогаш подредени по нивното име.
- Дополнително во класата ChatSystem постојат следните методи за работа со корисниците:
- ChatSystem() - default constructor
- register(String userName) - го регистрира корисникот во системот. Го додава во собата со најмалку корисници. Доколку има повеќе такви соби тогаш го додава во првата соба по лексикоргафско подредување.
- registerAndJoin(String userName, String roomName) - го регистрира корисникот во системот. Дополнително го додава во собата со име roomName.
- joinRoom(String userName, String roomName) - го додава корисникот во собата со соодветно име доколку таа постои, во спротивно фрла исклучок од типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
- leaveRoom(String username, String roomName) - го отстранува корисникот од собата со соодветно име доколку таа постои. во спротивно фрла исклучок од типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
- followFriend(String username, String friend_username) – корисникот со име username го приклучува во сите соби во кој е член корисникот со име friendUsername. Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
- */
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Scanner;
- import java.util.Set;
- import java.util.TreeSet;
- import java.util.stream.Collectors;
- import java.util.Comparator;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.TreeMap;
- import java.util.TreeSet;
- class ChatRoom {
- String name;
- Set<String> users;
- public ChatRoom(String name) {
- this.name = name;
- this.users = new TreeSet<>();
- }
- public void addUser(String userName) {
- users.add(userName);
- }
- public void removeUser(String userName) {
- users.remove(userName);
- }
- public boolean hasUser(String userName) {
- return users.contains(userName);
- }
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(name + "\n");
- if (users.isEmpty())
- sb.append("EMPTY");
- else
- sb.append(users.stream().collect(Collectors.joining("\n")));
- sb.append("\n");
- return sb.toString();
- }
- public int numUsers() {
- return users.size();
- }
- }
- class ChatSystem {
- Map<String, ChatRoom> rooms;
- TreeSet<String> users;
- public ChatSystem() {
- rooms = new TreeMap<>();
- users = new TreeSet<>();
- }
- public void addRoom(String roomName) {
- rooms.put(roomName, new ChatRoom(roomName));
- }
- public void removeRoom(String roomName) {
- rooms.remove(roomName);
- }
- public ChatRoom getRoom(String roomName) throws NoSuchRoomException {
- if (!rooms.containsKey(roomName))
- throw new NoSuchRoomException(roomName);
- return rooms.get(roomName);
- }
- public void register(String userName) throws NoSuchRoomException, NoSuchUserException {
- users.add(userName);
- if (!rooms.isEmpty()) {
- String min = rooms.values().stream()
- .min(Comparator.comparing(ChatRoom::numUsers).thenComparing(room -> room.name)).get().name;
- registerAndJoin(userName, min);
- }
- }
- public void registerAndJoin(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
- users.add(userName);
- joinRoom(userName, roomName);
- }
- public void joinRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
- if (!rooms.containsKey(roomName))
- throw new NoSuchRoomException(roomName);
- if (!users.contains(userName))
- throw new NoSuchUserException(userName);
- rooms.get(roomName).addUser(userName);
- }
- public void leaveRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
- if (!rooms.containsKey(roomName))
- throw new NoSuchRoomException(roomName);
- if (!users.contains(userName))
- throw new NoSuchUserException(userName);
- rooms.get(roomName).removeUser(userName);
- }
- public void followFriend(String userName, String friend_username) throws NoSuchUserException {
- if (!users.contains(friend_username))
- throw new NoSuchUserException(friend_username);
- rooms.values().stream().filter(room -> room.hasUser(friend_username)).forEach(room -> room.addUser(userName));
- }
- }
- class NoSuchRoomException extends Exception {
- public NoSuchRoomException(String roomName) {
- super("No such room " + roomName);
- }
- }
- class NoSuchUserException extends Exception {
- public NoSuchUserException(String userName) {
- super("No such user " + userName);
- }
- }
- public class ChatSystemTest {
- public static void main(String[] args)
- throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchRoomException {
- Scanner jin = new Scanner(System.in);
- int k = jin.nextInt();
- if (k == 0) {
- ChatRoom cr = new ChatRoom(jin.next());
- int n = jin.nextInt();
- for (int i = 0; i < n; ++i) {
- k = jin.nextInt();
- if (k == 0)
- cr.addUser(jin.next());
- if (k == 1)
- cr.removeUser(jin.next());
- if (k == 2)
- System.out.println(cr.hasUser(jin.next()));
- }
- System.out.println("");
- System.out.println(cr.toString());
- n = jin.nextInt();
- if (n == 0)
- return;
- ChatRoom cr2 = new ChatRoom(jin.next());
- for (int i = 0; i < n; ++i) {
- k = jin.nextInt();
- if (k == 0)
- cr2.addUser(jin.next());
- if (k == 1)
- cr2.removeUser(jin.next());
- if (k == 2)
- cr2.hasUser(jin.next());
- }
- System.out.println(cr2.toString());
- }
- if (k == 1) {
- ChatSystem cs = new ChatSystem();
- Method mts[] = cs.getClass().getMethods();
- while (true) {
- String cmd = jin.next();
- if (cmd.equals("stop"))
- break;
- if (cmd.equals("print")) {
- System.out.println(cs.getRoom(jin.next()) + "\n");
- continue;
- }
- for (Method m : mts) {
- if (m.getName().equals(cmd)) {
- String params[] = new String[m.getParameterTypes().length];
- for (int i = 0; i < params.length; ++i)
- params[i] = jin.next();
- m.invoke(cs, params);
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment