Advertisement
Tochoz

open

May 10th, 2024
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.27 KB | None | 0 0
  1. package openhashes;
  2. public class Dict {
  3.     private int CLASS_COUNT = 5; // количество классов в словаре
  4.     private Item 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<s.length(); i++)
  19.             out[i] = s.charAt(i);
  20.         return out;
  21.     }
  22.  
  23.     private class Item { // Объект связного списка
  24.         char[] name;
  25.         Item next;
  26.  
  27.         private static void writeName(char[] from, char[] to){ // Метод берёт массив символов from и записывает в to
  28.             // цикл по массиву и перезаписывание символов из from в to
  29.             for (int i=0; i<10 && from[i] != 0; i++)
  30.                 to[i] = from[i];
  31.         }
  32.  
  33.         public Item(char[] x){
  34.             name = new char[10];
  35.             writeName(x, name);
  36.         }
  37.  
  38.         private void deleteNext(){ // метод удаляет следующий за текущим элемент
  39.             // указатели на следующий равен указателю следующего элемента
  40.             next = next.next;
  41.         }
  42.  
  43.     }
  44.  
  45.  
  46.     public Dict(){ // Конструктор по умолчанию, выделяет память на массив классов
  47.         a = new Item[CLASS_COUNT];
  48.     }
  49.  
  50.     public Dict(int n){ // Принимает количество возможных элементов множества (область определения)
  51.         CLASS_COUNT = n/10;
  52.         a = new Item[CLASS_COUNT];
  53.     }
  54.  
  55.     private Item findPrevforMember(char[] name, Item head) { //!на непустом списке! метод ищет предыдущий элемент перед искомым именем в списке, на вход получает голову списка
  56.         // если элемента нет в списке вернётся хвост (prev.next == null)
  57.  
  58.         // два указателя fir = head sec = head.next
  59.         Item fir = head, sec = head.next;
  60.  
  61.         // пока второй не равен искомому или null
  62.         while (sec != null && !arraysEqual(sec.name, name)) {
  63.             fir = sec;
  64.             sec = sec.next;
  65.         }
  66.  
  67.         return fir;// вернуть первый
  68.     }
  69.  
  70.     private int computeHash(char[] a){ // метод считает хэш для имени
  71.         int out = 0;
  72.         for (int i=0; a[i]!=0 && i<10; i++)
  73.             out = (out + a[i]) % CLASS_COUNT;
  74.         return out;
  75.     }
  76.  
  77.     public boolean MEMBER(String x){ // метод проверяет наличие имени в словаре
  78.         char[] name = generateCharArray(x); // Сформировать массив символов
  79.         // определить номер класса вычислив хэш
  80.         int hash = computeHash(name);
  81.  
  82.         // если список пустой вернуть ложь
  83.         if (a[hash] == null) return false;
  84.  
  85.         // найти предыдущий элемент в списке нужного класса
  86.         Item prev = findPrevforMember(name, a[hash]);
  87.  
  88.         return (prev.next != null); // если следующий есть то true
  89.     }
  90.  
  91.     public void INSERT(String x){ // метод вставляет имя в словарь, если его ещё там нет
  92.         char[] name = generateCharArray(x); // Сформировать массив символов
  93.         // определить номер класса вычислив хэш
  94.         int hash = computeHash(name);
  95.  
  96.         // если список пустой вставить в голову
  97.         if (a[hash] == null) {
  98.             a[hash] = new Item(name);
  99.             return;
  100.         }
  101.  
  102.         // проверить наличие в классе (вызвать findPrevforMember на списке нужного класса) если есть, ничего не делаем
  103.         Item prev = findPrevforMember(name, a[hash]);
  104.  
  105.         if (prev.next != null) return; // если следующий есть то элемент уже в списке
  106.  
  107.         // если элемента нет, добавить его в голову
  108.         Item temp = a[hash]; // указатель чтобы не потерять голову
  109.         a[hash] = new Item(name);
  110.         a[hash].next = temp;
  111.     }
  112.  
  113.     public void DELETE(String x){
  114.         char[] name = generateCharArray(x); // Сформировать массив символов
  115.  
  116.         // определить номер класса вычислив хэш
  117.         int hash = computeHash(name);
  118.  
  119.         // если список пустой ничего не делать
  120.         if (a[hash] == null) return;
  121.  
  122.         // Если в списке имя находится в голове, удаляем его
  123.         if (arraysEqual(a[hash].name, name)) {
  124.             a[hash] = a[hash].next;
  125.             return;
  126.         }
  127.  
  128.         // найти предыдущий элемент перед искомым
  129.         Item prev = findPrevforMember(name, a[hash]);
  130.  
  131.         if (prev.next != null) prev.deleteNext(); // если следующий есть то удаляем
  132.     }
  133.  
  134.     public void MAKENULL(){
  135.         for (int i=0; i<CLASS_COUNT; i++)
  136.             a[i] = null;
  137.     }
  138.  
  139.     public void PRINT(){
  140.         for (int i=0; i<CLASS_COUNT; i++){
  141.             if (a[i] != null) {
  142.                 System.out.print(a[i].name);
  143.                 System.out.print(" ");
  144.                 Item el = a[i].next;
  145.                 while (el != null) {
  146.                     System.out.print(el.name);
  147.                     System.out.print(" ");
  148.                     el = el.next;
  149.                 }
  150.             }
  151.         }
  152.         System.out.println();
  153.     }
  154. }
  155.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement