Advertisement
Guest User

Text Editor

a guest
Jan 27th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.82 KB | None | 0 0
  1. package _01TextEditor;
  2.  
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5.  
  6. /**
  7.  * Created by IntelliJ IDEA.
  8.  * User: LAPD
  9.  * Date: 26.1.2019 г.
  10.  * Time: 18:22 ч.
  11.  */
  12. public class TextEditorImpl implements TextEditor {
  13.  
  14.     private Map<String, Boolean> userIsLogged;
  15.     private Trie<Deque<StringBuilder>> userTexts;
  16.  
  17.     public TextEditorImpl() {
  18.         this.userIsLogged = new LinkedHashMap<>();
  19.         this.userTexts = new Trie<>();
  20.     }
  21.  
  22.  
  23.     private boolean isNotLogged(String username) {
  24.         return !this.userIsLogged.containsKey(username)
  25.                 || !this.userIsLogged.get(username);
  26.     }
  27.  
  28.     @Override
  29.     public void login(String username) {
  30.  
  31.         if (!isNotLogged(username)) {
  32.             this.clear(username);
  33.             return;
  34.         }
  35.  
  36.         Deque<StringBuilder> textChanges = new ArrayDeque<>();
  37.         textChanges.push(new StringBuilder());
  38.  
  39.         this.userTexts.insert(username, textChanges);
  40.  
  41.         this.userIsLogged.put(username, true);
  42.     }
  43.  
  44.     @Override
  45.     public void logout(String username) {
  46.         if (isNotLogged(username)) return;
  47.  
  48.         Deque<StringBuilder> textChanges = new ArrayDeque<>();
  49.         textChanges.push(new StringBuilder());
  50.         this.userTexts.insert(username, textChanges);
  51.  
  52.         this.userIsLogged.put(username, false);
  53.     }
  54.  
  55.     @Override
  56.     public void prepend(String username, String string) {
  57.         this.insert(username, 0, string);
  58.     }
  59.  
  60.     @Override
  61.     public void insert(String username, int index, String string) {
  62.         if (isNotLogged(username)) return;
  63.  
  64.         Deque<StringBuilder> textsValue = this.userTexts
  65.                 .getValue(username);
  66.         StringBuilder lastValue = textsValue.peek();
  67.  
  68.         try {
  69.             assert lastValue != null;
  70.             lastValue.insert(index, string
  71.                     .replace("\"", ""));
  72.             textsValue.push(lastValue);
  73.         } catch (StringIndexOutOfBoundsException ignored) {
  74.             ;
  75.         }
  76.     }
  77.  
  78.     @Override
  79.     public void substring(String username, int startIndex, int length) {
  80.         if (isNotLogged(username)) return;
  81.  
  82.         Deque<StringBuilder> textsValue = this.userTexts
  83.                 .getValue(username);
  84.         StringBuilder lastValue = textsValue.peek();
  85.  
  86.         try {
  87.             assert lastValue != null;
  88.             String substring = lastValue
  89.                     .substring(startIndex, startIndex + length);
  90.             textsValue.push(new StringBuilder(substring));
  91.         } catch (StringIndexOutOfBoundsException ignored) {
  92.             ;
  93.         }
  94.     }
  95.  
  96.     @Override
  97.     public void delete(String username, int startIndex, int length) {
  98.         if (isNotLogged(username)) return;
  99.  
  100.         Deque<StringBuilder> textsValue = this.userTexts
  101.                 .getValue(username);
  102.         StringBuilder lastValue = textsValue.peek();
  103.  
  104.         try {
  105.             assert lastValue != null;
  106.             StringBuilder replaced = lastValue
  107.                     .replace(startIndex, startIndex + length, "");
  108.             textsValue.push(replaced);
  109.         } catch (StringIndexOutOfBoundsException ignored) {
  110.             ;
  111.         }
  112.     }
  113.  
  114.     @Override
  115.     public void clear(String username) {
  116.         this.substring(username, 0, 0);
  117.     }
  118.  
  119.     @Override
  120.     public int length(String username) {
  121.         return this.print(username).length();
  122.     }
  123.  
  124.     @Override
  125.     public String print(String username) {
  126.         if (isNotLogged(username)) return "";
  127.  
  128.         Deque<StringBuilder> textsValue = this.userTexts
  129.                 .getValue(username);
  130.         StringBuilder lastValue = textsValue.peek();
  131.  
  132.         assert lastValue != null;
  133.         return lastValue.toString();
  134.     }
  135.  
  136.     @Override
  137.     public void undo(String username) {
  138.         if (isNotLogged(username)) return;
  139.  
  140.         Deque<StringBuilder> textsValue = this.userTexts
  141.                 .getValue(username);
  142.  
  143.         if (textsValue.size() > 1) {
  144.             textsValue.pop();
  145.         }
  146.     }
  147.  
  148.     @Override
  149.     public Iterable<String> users(String prefix) {
  150.  
  151.         List<String> loggedUsersByTime = this.userIsLogged.entrySet()
  152.                 .stream()
  153.                 .filter(Map.Entry::getValue)
  154.                 .map(Map.Entry::getKey)
  155.                 .collect(Collectors.toList());
  156.  
  157.         if (prefix.isEmpty()) {
  158.             return loggedUsersByTime;
  159.         }
  160.  
  161.         Trie<String> users = new Trie<>();
  162.         loggedUsersByTime.forEach(u -> users.insert(u, ""));
  163.  
  164.         Iterable<String> usersByPrefix = users.getByPrefix(prefix);
  165.  
  166.         Collection<String> usersByPrefixCollection = new ArrayList<>();
  167.         usersByPrefix.forEach(usersByPrefixCollection::add);
  168.  
  169.         loggedUsersByTime.removeIf(u -> !usersByPrefixCollection.contains(u));
  170.  
  171.         return loggedUsersByTime;
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement