Advertisement
CR7CR7

StringDetector

Jun 25th, 2023
1,002
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.31 KB | None | 0 0
  1. import java.lang.reflect.Array;
  2. import java.nio.charset.StandardCharsets;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7.  
  8.  
  9. public class LanguageDetector {
  10.     HashMap<Integer>[] languageTables;
  11.     LinkedList<String> languages;
  12.     int n;
  13.     int N;
  14.  
  15.     public LanguageDetector(int n, int N) {
  16.         this.n = n;
  17.         this.N = N;
  18.         languageTables = new HashMap[N];
  19.         languages = new LinkedList<>();
  20.     }
  21.  
  22.     public void learnLanguage(String language, String text) {
  23.         if (!languages.contains(language)) {
  24.             languages.add(language);
  25.             languageTables[languages.indexOf(language)] = new HashMap<>(N, 31);
  26.         }
  27.  
  28.         HashMap<Integer> table;
  29.  
  30.         table = languageTables[languages.indexOf(language)];
  31.         for (int i = 0; i <= text.length() - n; i++) {
  32.             String ngram = text.substring(i, i + n);
  33.             int count = table.get(ngram) == null ? 0 : table.get(ngram);
  34.             table.put(ngram, count + 1);
  35.         }
  36.     }
  37.  
  38.     public int getCount(String ngram, String language) {
  39.         if (!languages.contains(language)) return 0;
  40.         HashMap<Integer> table = languageTables[languages.indexOf(language)];
  41.         return table.get(ngram) == null ? 0 : table.get(ngram);
  42.     }
  43.  
  44.     public HashMap<Integer> apply(String text) {
  45.         HashMap<Integer> votes = new HashMap<>(101, 31);
  46.         for (int i = 0; i <= text.length() - n; i++) {
  47.             String ngram = text.substring(i, i + n);
  48.             if (ngram.equals(null) || ngram.isEmpty()) continue;
  49.             HashMap<Integer> maxVotes = new HashMap<>(101,   31);
  50.             int maxCount = 0;
  51.             for (String language : languages) {
  52.                 int count = getCount(ngram, language);
  53.                 if (count > maxCount) {
  54.                     maxVotes.clear();
  55.                     maxVotes.put(language, 1);
  56.                     maxCount = count;
  57.                 } else if (count == maxCount) {
  58.                     int vote = maxVotes.get(language) != null ? maxVotes.get(language) : 0;
  59.                     maxVotes.put(language, vote + 1);
  60.                 }
  61.             }
  62.             String[] keys = maxVotes.keySet().toArray(new String[0]);
  63.             for (String language : keys) {
  64.                 votes.put(language, (votes.get(language) != null ? votes.get(language) : 0) + maxVotes.get(language));
  65.             }
  66.         }
  67.         return votes;
  68.     }
  69.  
  70.     public static class HashMap<T> {
  71.  
  72.         public boolean remove(String key) {
  73.             int hashCode = hashCode(key);
  74.             int index = hashCode;
  75.             for (int i = 0; i < table.length; i++) {
  76.                 if (table[index] != null && table[index].key.equals(key)) {
  77.                     table[index] = null;
  78.                     return true;
  79.                 }
  80.                 index = (index + 2 * i + 1) % table.length;
  81.             }
  82.             return false;
  83.         }
  84.  
  85.         public void removeAll(String[] keySet) {
  86.             for (String key : keySet) {
  87.                 remove(key);
  88.             }
  89.         }
  90.  
  91.         public String[] keySet() {
  92.             List<String> keys = new ArrayList<>();
  93.             for (Entry entry : table) {
  94.                 if (entry != null) {
  95.                     keys.add(entry.key);
  96.                 }
  97.             }
  98.             return keys.toArray(new String[0]);
  99.         }
  100.  
  101.         public class Entry {
  102.             String key;
  103.             T value;
  104.  
  105.             Entry(String key, T value) {
  106.                 this.key = key;
  107.                 this.value = value;
  108.             }
  109.         }
  110.  
  111.         Entry[] table;
  112.         int basis;
  113.  
  114.         public HashMap(int N, int basis) {
  115.             table = (Entry[]) Array.newInstance(Entry.class, N);
  116.             this.basis = basis;
  117.         }
  118.  
  119.         public double fillRatio() {
  120.             int count = 0;
  121.             for (Entry e : table) {
  122.                 if (e != null) count++;
  123.             }
  124.             return (double) count / table.length;
  125.         }
  126.  
  127.         public int hashCode(String s) {
  128.             int hash = 0;
  129.             byte[] bytes = s.getBytes(StandardCharsets.US_ASCII);
  130.             for (int i = 0; i < bytes.length; i++) {
  131.                 hash = (hash * basis + bytes[i]) % table.length;
  132.             }
  133.             return hash;
  134.         }
  135.  
  136.         public T get(String key) {
  137.             int hashCode = hashCode(key);
  138.             int index = hashCode;
  139.             for (int i = 0; i < table.length; i++) {
  140.                 if (table[index] != null && table[index].key.equals(key)) return table[index].value;
  141.                 index = (index + 2 * i + 1) % table.length;
  142.             }
  143.             return null;
  144.         }
  145.  
  146.         public boolean add(String key, T value) {
  147.             int hash = hashCode(key);
  148.             int index = hash;
  149.             for (int i = 0; i < table.length; i++) {
  150.                 if (table[index] == null) {
  151.                     table[index] = new Entry(key, value);
  152.                     return true;
  153.                 }
  154.                 if (table[index].key.equals(key)) {
  155.                     table[index].value = value;
  156.                     return true;
  157.                 }
  158.                 index = (index + 2 * i + 1) % table.length;
  159.             }
  160.             return false;
  161.         }
  162.     }
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement