Advertisement
Tochoz

Close

May 10th, 2024
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.61 KB | None | 0 0
  1. package closehashes;
  2. public class Dict {
  3.     private int CAPACITY = 10; // количество классов в словаре
  4.     private char[][] a; // массив символьных массивов имён
  5.  
  6.     private static boolean arraysEqual(char[] a, char[] b) { // Метод проверки массивов на равенство
  7.         if (a == b) return true;
  8.  
  9.         for (int i = 0; i < a.length; i++) {
  10.             if (a[i] != b[i]) return false;
  11.             if (a[i] == 0) break;
  12.         }
  13.         return true;
  14.     }
  15.  
  16.     private static char[] generateCharArray(String s){
  17.         char[] out = new char[10];
  18.         for (int i=0; i<out.length; i++)
  19.             out[i] = s.charAt(i);
  20.         return out;
  21.     }
  22.  
  23.     public Dict() { // Конструктор по умолчанию, выделяет память на массив классов
  24.         a = new char[CAPACITY][];
  25.     }
  26.  
  27.     public Dict(int n) { // Принимает количество возможных элементов множества (область определения)
  28.         CAPACITY = n;
  29.         a = new char[CAPACITY][];
  30.     }
  31.  
  32.     private int computeHash(char[] a) { //  todo метод считает значение хэша
  33.         int out = 0;
  34.         for (int i = 0; a[i] != 0 && i < 10; i++)
  35.             out += a[i];
  36.         return out;
  37.     }
  38.  
  39.     private int repeatHash(int hash, int i) { // метод считает повторный хэш для существующего хэша i -- номер повторного хэширования
  40.         return (hash + i) % CAPACITY;
  41.     } // todo функция хэширования
  42.  
  43.     private int find(char[] name){ // метод ищет имя в массиве и возвращает индекс, если его нет, возвращает -1
  44.         // посчитать хэш
  45.         int hash = computeHash(name);
  46.  
  47.         int i=0; // Номер повторения
  48.         int startInd = repeatHash(hash, i++);
  49.         // проверить на равенство имени если элемент пустой, вернуть -1
  50.         if (a[startInd] == null) return -1;
  51.         // Если нашли совпадение возвращаем индекс найденного имени
  52.         if (arraysEqual(name, a[startInd])) return startInd;
  53.  
  54.         // создать переменную повторного хэша
  55.         int nextInd=repeatHash(hash, i++);
  56.  
  57.         // Цикл повторных хэширований пока не вернулись в ту же позицию или не наткнулись на пустой
  58.         while (a[nextInd] != null && nextInd != startInd) {
  59.             if (arraysEqual(name, a[nextInd])) return nextInd; // если нашли, возвращаем позицию
  60.             nextInd = repeatHash(hash, i++); // пересчитываем хэш
  61.         }
  62.  
  63.         return -1; // если не нашли то элемента нет
  64.     }
  65.  
  66.  
  67.  
  68.     public boolean MEMBER(String x) { // метод проверяет наличие имени в словаре
  69.         char[] name = generateCharArray(x); // Сформировать массив символов
  70.         //найти имя через find
  71.         int ind = find(name);
  72.  
  73.         return (ind != -1); // Если вернулся не -1, то имя есть в словаре
  74.     }
  75.  
  76.     public void INSERT(String x) { // метод вставляет имя в словарь, если его ещё там нет
  77.         char[] name = generateCharArray(x); // Сформировать массив символов
  78.  
  79.         // посчитать хэш
  80.         int hash = computeHash(name);
  81.  
  82.         int i=0; // Номер повторения
  83.         int startInd = repeatHash(hash, i++);
  84.         // проверить на равенство имени если элемент пустой, вернуть -1
  85.         if (a[startInd] == null) {
  86.             a[startInd] = name;
  87.             return;
  88.         }
  89.         if (arraysEqual(name, a[startInd])) return ;
  90.  
  91.         // создать переменную повторного хэша
  92.         int nextInd=repeatHash(hash, i++);
  93.         int first_deleted = -1; // Переменная запоминающая индекс первого найденного удалённого
  94.         if (a[startInd][0] == 0) first_deleted = startInd; // если в первом элементе удалённое имя, сразу запоминаем
  95.  
  96.         while (a[nextInd] != null && nextInd != startInd) { // Цикл повторных хэширований пока не вернулись в тот же хэш или не наткнулись на пустой
  97.             if (arraysEqual(name, a[nextInd])) return; // если нашли выходим
  98.  
  99.             // если не был найден ещё удалённый и нашли такой запоминаем
  100.             if (first_deleted == -1 && a[nextInd][0] == 0) first_deleted = nextInd;
  101.  
  102.             nextInd = repeatHash(hash, i++); // пересчитываем хэш
  103.         }
  104.  
  105.         if (nextInd == startInd) throw new MyException("Словарь заполнен"); // если мы вернулись к тому же хешу, словарь заполнен
  106.  
  107.         a[(first_deleted == -1)? nextInd: first_deleted] = name; // вставляем имя в удалённый, если он был, иначе туда, куда пришли
  108.     }
  109.  
  110.     public void DELETE(String x) { // почему бы при проходе для удаления не искать предыдущий а поменять контенты со следующим и удалить следующий
  111.         char[] name = generateCharArray(x); // Сформировать массив символов
  112.         //найти имя через find
  113.         int ind = find(name);
  114.  
  115.         if (ind == -1) return; // если индекс -1 то такого элемента нет, ничего не делаем
  116.  
  117.         //записываем в начало символьного массива терминальный символ
  118.         a[ind][0] = 0;
  119.     }
  120.  
  121.     public void MAKENULL() { // Зануление голов связных списков
  122.         for (int i = 0; i < CAPACITY; i++)
  123.             a[i] = null;
  124.     }
  125.  
  126.     public void PRINT(){
  127.         for (int i=0; i<CAPACITY; i++){
  128.             if (a[i] != null && a[i][0] != 0) {
  129.                 System.out.print(a[i]);
  130.                 System.out.print(" ");
  131.             }
  132.         }
  133.         System.out.println();
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement