SashkoKlincharov

[Java][НП] - Администрација на чет-систем

Aug 26th, 2021
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.13 KB | None | 0 0
  1. Треба да се развие класа за администрација на чет‐систем(chat). Системот се состои од повеќе чет‐соби, објекти од класата ChatRoom. Во ChatRoom ги чуваме името на собата и имињата на корисниците кои тековно се наоѓаат во таа соба (за корисниците да се користи соодветен Set).
  2.  
  3. ChatRoom(String name) ‐ креира нова празна соба за чет (празна значи без корисници).
  4. addUser(String username) - го додава корисникот со тоа име во собата.
  5. removeUser(String username) - го отстранува корисникот со тоа име од собата доколку има таков, во спротивно не прави ништо.
  6. toString():String - враќа стринг кои ги содржи името на собата и сите корисници кои се во собата секој одделен со нов ред. Корисниците се подредени алфабетски. Ако собата е празна се враќа името на собата во еден ред, а во вториот ред стрингот "EMPTY" (наводници само за појаснување).
  7. hasUser(String username):boolean - враќа true ако постои корисник со тоа име во собата.
  8. numUsers():int - го враќа бројот на корисници во собата.
  9.  
  10. Главната класа ChatSystem ги содржи сите соби и сите орисници. Корисниците може да се членови на една, повеќе или да не се членови на ниедна соба. За менаџмент на собите треба да ги понудите следните три методи:
  11.  
  12. addRoom(String roomName) - додава нова празна соба во листата на соби.
  13. removeRoom(String roomName) - ја отстранува собата од листата.
  14. getRoom(String roomName):ChatRoom - го враќа објектот кој ја претставува собата со име roomName. Фрлете NoSuchRoomException(roomName) доколку не постои соба со тоа име.
  15.  
  16. Забелешка: Собите чувајте ги во TreeMap за да бидат секогаш подредени по нивното име.
  17.  
  18. Дополнително во класата ChatSystem постојат следните методи за работа со корисниците:
  19.  
  20. ChatSystem() - default constructor
  21. register(String userName) - го регистрира корисникот во системот. Го додава во собата со најмалку корисници. Доколку има повеќе такви соби тогаш го додава во првата соба по лексикоргафско подредување.
  22. registerAndJoin(String userName, String roomName) - го регистрира корисникот во системот. Дополнително го додава во собата со име roomName.
  23. joinRoom(String userName, String roomName) - го додава корисникот во собата со соодветно име доколку таа постои, во спротивно фрла исклучок од типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
  24. leaveRoom(String username, String roomName) - го отстранува корисникот од собата со соодветно име доколку таа постои. во спротивно фрла исклучок од типот NoSuchRoomExcеption(roomName). Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName).
  25. followFriend(String username, String friend_username) – корисникот со име username го приклучува во сите соби во кој е член корисникот со име friendUsername. Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(userName)
  26.  
  27.  
  28.  
  29.  
  30. import java.lang.reflect.InvocationTargetException;
  31. import java.lang.reflect.Method;
  32. import java.util.*;
  33. import java.util.TreeSet;
  34.  
  35. class User implements Comparable<User>{
  36. private String userName;
  37.  
  38. public User(String userName) {
  39. this.userName = userName;
  40. }
  41.  
  42. public String getUserName() {
  43. return userName;
  44. }
  45.  
  46. @Override
  47. public boolean equals(Object o) {
  48. if(this == o)
  49. return true;
  50. if(o == null)
  51. return false;
  52. if(o.getClass() != this.getClass())
  53. return false;
  54. User other = (User) o;
  55. if(userName == null){
  56. if(other.userName != null)
  57. return false;
  58. }else if(!userName.equals(other.userName))
  59. return false;
  60. return true;
  61. }
  62.  
  63. @Override
  64. public int hashCode() {
  65. final int prime = 31;
  66. int result = 1;
  67. result = prime * result + ((userName == null) ? 0 : userName.hashCode());
  68. return result;
  69. }
  70.  
  71. @Override
  72. public String toString() {
  73. return userName;
  74. }
  75.  
  76. @Override
  77. public int compareTo(User o) {
  78. return this.userName.compareTo(o.userName);
  79. }
  80. }
  81.  
  82. class ChatRoom {
  83. private String roomName;
  84. private Set<User> users;
  85.  
  86. public ChatRoom(String roomName) {
  87. this.roomName = roomName;
  88. users = new TreeSet<>();
  89. }
  90.  
  91. public String getRoomName() {
  92. return roomName;
  93. }
  94. public void addUser(String username){
  95. users.add(new User(username));
  96. }
  97. public void removeUser(String username){
  98. User user = new User(username);
  99. users.remove(user);
  100. }
  101.  
  102. public boolean hasUser(String username){
  103. User u = new User(username);
  104. return users.contains(u);
  105. }
  106.  
  107. public int numUsers(){
  108. return users.size();
  109. }
  110.  
  111. @Override
  112. public String toString() {
  113. StringBuilder sb = new StringBuilder();
  114. sb.append(roomName + "\n");
  115. if (numUsers() > 0)
  116. users.forEach(each -> sb.append(each.toString()).append("\n"));
  117. else
  118. sb.append("EMPTY\n");
  119. return sb.toString();
  120. // StringBuilder sb = new StringBuilder();
  121. // sb.append(this.roomName + "\n");
  122. // users
  123. // .stream()
  124. // .forEach(user -> sb.append(user).append("\n"));
  125. // if(users.size() == 0)
  126. // sb.append("EMPTY");
  127. // return sb.toString();
  128. }
  129. }
  130.  
  131. class ChatSystem {
  132. private Map<String,ChatRoom> rooms;
  133. private Set<User> users;
  134.  
  135. public ChatSystem() {
  136. rooms = new TreeMap<>();
  137. users = new HashSet<>();
  138. }
  139. public void addRoom(String roomName){
  140. // rooms.putIfAbsent(roomName,new ChatRoom(roomName));
  141. rooms.put(roomName,new ChatRoom(roomName));
  142. }
  143. public void removeRoom(String roomName){
  144. rooms.remove(roomName);
  145. }
  146.  
  147. public ChatRoom getRoom(String roomName) throws NoSuchRoomException {
  148. if(!rooms.containsKey(roomName))
  149. throw new NoSuchRoomException(roomName);
  150. return rooms.get(roomName);
  151. }
  152.  
  153.  
  154. public void register(String userName) throws NoSuchRoomException, NoSuchUserException {
  155. users.add(new User(userName));
  156. ChatRoom r = rooms.values().stream().min((left,right)->{
  157. if(left.numUsers() == right.numUsers())
  158. return left.getRoomName().compareTo(right.getRoomName());
  159. else return Integer.compare(left.numUsers(),right.numUsers());
  160. }).orElse(null);
  161.  
  162. if(r == null)
  163. return;
  164. joinRoom(userName,r.getRoomName());
  165. }
  166. public void registerAndJoin(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  167. users.add(new User(userName));
  168. joinRoom(userName,roomName);
  169. }
  170. public void joinRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  171. if(!rooms.containsKey(roomName)) {
  172. throw new NoSuchRoomException(roomName);
  173. }
  174. if(!users.contains(new User(userName)))
  175. throw new NoSuchUserException(userName);
  176. rooms.computeIfPresent(roomName,(k,v) ->
  177. {
  178. v.addUser(userName);
  179. return v;
  180. });
  181. }
  182.  
  183. public void leaveRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException {
  184. if(!rooms.containsKey(roomName))
  185. throw new NoSuchRoomException(roomName);
  186. if(!users.contains(new User(userName)))
  187. throw new NoSuchUserException(userName);
  188. rooms.computeIfPresent(roomName,(k,v) ->{
  189. v.removeUser(userName);
  190. return v;
  191. });
  192. // users.remove(new User(userName));
  193. }
  194.  
  195. public void followFriend(String username, String friend_username) throws NoSuchUserException {
  196. if(!users.contains(new User(username)))
  197. throw new NoSuchUserException(username);
  198. rooms
  199. .values()
  200. .forEach(r -> {
  201. if (r.hasUser(friend_username))
  202. r.addUser(username);
  203. });
  204.  
  205.  
  206. }
  207.  
  208.  
  209. }
  210.  
  211. class NoSuchRoomException extends Exception {
  212.  
  213. public NoSuchRoomException(String message) {
  214. super(message);
  215. }
  216.  
  217. }
  218.  
  219. class NoSuchUserException extends Exception {
  220.  
  221. public NoSuchUserException(String message) {
  222. super(message);
  223. }
  224. }
  225.  
  226. public class ChatSystemTest {
  227.  
  228. public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchRoomException {
  229. Scanner jin = new Scanner(System.in);
  230. int k = jin.nextInt();
  231. if ( k == 0 ) {
  232. ChatRoom cr = new ChatRoom(jin.next());
  233. int n = jin.nextInt();
  234. for ( int i = 0 ; i < n ; ++i ) {
  235. k = jin.nextInt();
  236. if ( k == 0 ) cr.addUser(jin.next());
  237. if ( k == 1 ) cr.removeUser(jin.next());
  238. if ( k == 2 ) System.out.println(cr.hasUser(jin.next()));
  239. }
  240. System.out.println("");
  241. System.out.println(cr.toString());
  242. n = jin.nextInt();
  243. if ( n == 0 ) return;
  244. ChatRoom cr2 = new ChatRoom(jin.next());
  245. for ( int i = 0 ; i < n ; ++i ) {
  246. k = jin.nextInt();
  247. if ( k == 0 ) cr2.addUser(jin.next());
  248. if ( k == 1 ) cr2.removeUser(jin.next());
  249. if ( k == 2 ) cr2.hasUser(jin.next());
  250. }
  251. System.out.println(cr2.toString());
  252. }
  253. if ( k == 1 ) {
  254. ChatSystem cs = new ChatSystem();
  255. Method mts[] = cs.getClass().getMethods();
  256. while ( true ) {
  257. String cmd = jin.next();
  258. if ( cmd.equals("stop") ) break;
  259. if ( cmd.equals("print") ) {
  260. System.out.println(cs.getRoom(jin.next())+"\n");continue;
  261. }
  262. for ( Method m : mts ) {
  263. if ( m.getName().equals(cmd) ) {
  264. String params[] = new String[m.getParameterTypes().length];
  265. for ( int i = 0 ; i < params.length ; ++i ) params[i] = jin.next();
  266. m.invoke(cs,params);
  267. }
  268. }
  269. }
  270. }
  271. }
  272.  
  273. }
  274.  
  275.  
  276.  
  277.  
  278. Sample input
  279.  
  280. 0 ChatRoom1
  281. 5
  282. 0 user1
  283. 0 user2
  284. 0 user3
  285. 0 user4
  286. 0 user5
  287. 0
  288.  
  289. Sample output
  290.  
  291. ChatRoom1
  292. user1
  293. user2
  294. user3
  295. user4
  296. user5
  297.  
  298.  
Add Comment
Please, Sign In to add comment