Advertisement
StefanTodorovski

[НП] Уникатни имиња

Feb 7th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.67 KB | None | 0 0
  1. /*
  2. Да се имплементира класа Names со следните методи:
  3.  
  4. public void addName(String name) - додавање на име
  5.  
  6. public void printN(int n) - ги печати сите имиња кои се појавуваат n или повеќе пати, подредени лексикографски според името, на крајот на зборот во загради се печати бројот на појавувања, а по него на крај бројот на уникатни букви во зборот (не се прави разлика на големи и мали)
  7.  
  8. public String findName(int len, int x) - го враќа името кое со наоѓа на позиција x (почнува од 0) во листата од уникатни имиња подредени лексикографски, по бришење на сите имиња со големина поголема или еднаква на len. Позицијата x може да биде поголема од бројот на останати имиња, во тој случај се продожува со броење од почетокот на листата. Пример за листа со 3 имиња A, B, C, ако x = 7, се добива B. A0, B1, C2, A3, B4, C5, A6, B7.
  9. */
  10.  
  11. import java.util.*;
  12. import java.util.stream.Collectors;
  13.  
  14. public class NamesTest {
  15.     public static void main(String[] args) {
  16.         Scanner scanner = new Scanner(System.in);
  17.         int n = scanner.nextInt();
  18.         scanner.nextLine();
  19.         Names names = new Names();
  20.         for (int i = 0; i < n; ++i) {
  21.             String name = scanner.nextLine();
  22.             names.addName(name);
  23.         }
  24.         n = scanner.nextInt();
  25.         System.out.printf("===== PRINT NAMES APPEARING AT LEAST %d TIMES =====\n", n);
  26.         names.printN(n);
  27.         System.out.println("===== FIND NAME =====");
  28.         int len = scanner.nextInt();
  29.         int index = scanner.nextInt();
  30.         System.out.println(names.findName(len, index));
  31.         scanner.close();
  32.     }
  33. }
  34.  
  35. class Name {
  36.     private String name;
  37.     private Integer occurances;
  38.  
  39.     public Name(String name) {
  40.         this.name = name;
  41.         this.occurances = 0;
  42.     }
  43.  
  44.     public String getName() {
  45.         return name;
  46.     }
  47.  
  48.     public Integer getOccurances() {
  49.         return occurances;
  50.     }
  51.  
  52.     public void increaseOccurances() {
  53.         occurances++;
  54.     }
  55.  
  56.     public Integer getUniqueLetters() {
  57.         TreeSet<Character> uniqueChars = new TreeSet<>();
  58.         char[] letters = name.toLowerCase().toCharArray();
  59.         for(char letter : letters) {
  60.            uniqueChars.add(letter);
  61.         }
  62.         return uniqueChars.size();
  63.     }
  64.  
  65.     @Override
  66.     public String toString() {
  67.         return name + " (" + occurances + ") " + getUniqueLetters();
  68.     }
  69. }
  70.  
  71. class Names {
  72.     private Map<String, Name> names;
  73.  
  74.     public Names() {
  75.         this.names = new TreeMap<>();
  76.     }
  77.  
  78.     public void addName(String name) {
  79.         Name newName = names.computeIfAbsent(name, Name::new);
  80.         newName.increaseOccurances();
  81.     }
  82.  
  83.     public void printN(int n) {
  84.         names.values().stream()
  85.                 .filter((name) -> name.getOccurances() >= n)
  86.                 .forEach(System.out::println);
  87.     }
  88.  
  89.     public String findName(int len, int x) {
  90.         List<String> nameSet =
  91.                 names.entrySet().stream()
  92.                 .filter((s) -> s.getValue().getName().length() < len)
  93.                 .map(Map.Entry::getKey)
  94.                 .collect(Collectors.toList());
  95.  
  96.         return nameSet.get(x % nameSet.size());
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement