diff --git a/Java4L8HW/src/alexrm84/ChainsHashTableImplement.java b/Java4L8HW/src/alexrm84/ChainsHashTableImplement.java new file mode 100644 index 0000000..8c06fd8 --- /dev/null +++ b/Java4L8HW/src/alexrm84/ChainsHashTableImplement.java @@ -0,0 +1,106 @@ +package alexrm84; + +import java.util.LinkedList; + +public class ChainsHashTableImplement implements HashTable { + + public static final Integer INVALID_COST = null; + + private class Entry{ + private Item key; + private int value; + + public Entry(Item key, int value) { + this.key = key; + this.value = value; + } + + @Override + public String toString() { + return "Entry{" + + "key=" + key + + ", value=" + value + + '}'; + } + } + + private LinkedList[] data; + private int size; + private int maxSize; + + public ChainsHashTableImplement(int maxSize) { + this.data = new LinkedList[maxSize]; + this.maxSize = maxSize; + } + + private int hashFunc(int key){ + return key % data.length; + } + + @Override + public boolean put(Item item, Integer cost) { + int index = hashFunc(item.hashCode()); + if (data[index]==null){ + data[index] = new LinkedList<>(); + } + boolean check = true; + for (Entry entry:data[index]) { + if (entry.key.equals(item)){ + entry.value=cost; + check=false; + } + } + if (check){ + data[index].add(new Entry(item,cost)); + size++; + } + return true; + } + + @Override + public Integer get(Item item) { + int index = hashFunc(item.hashCode()); + for (Entry entry:data[index]) { + if (entry.key.equals(item)){ + return entry.value; + } + } + return INVALID_COST; + } + + @Override + public boolean remove(Item item) { + int index = hashFunc(item.hashCode()); + for (Entry entry:data[index]) { + if (entry.key.equals(item)){ + data[index].remove(entry); + size--; + return true; + } + } + return false; + } + + @Override + public int getSize() { + return size; + } + + @Override + public boolean isEmpty() { + return size==0; + } + + @Override + public void display() { + System.out.println("------------------------------"); + for (int i = 0; i < data.length; i++) { + if (data[i]!=null){ + for (Entry entry:data[i]) { + System.out.println(String.format("%d = [%s]",i,entry)); + } + } + } + System.out.println("------------------------------"); + } +} diff --git a/Java4L8HW/src/alexrm84/DoubleHashTableImplement.java b/Java4L8HW/src/alexrm84/DoubleHashTableImplement.java new file mode 100644 index 0000000..461bddd --- /dev/null +++ b/Java4L8HW/src/alexrm84/DoubleHashTableImplement.java @@ -0,0 +1,18 @@ +package alexrm84; + +public class DoubleHashTableImplement extends HashTableImplement{ + private static int DOUBLE_HASH_CONST = 5; + + public DoubleHashTableImplement(int maxSize) { + super(maxSize); + } + + @Override + protected int getStep(int key) { + return HashFuncDouble(key); + } + + private int HashFuncDouble(int key) { + return DOUBLE_HASH_CONST -(key% DOUBLE_HASH_CONST); + } +} diff --git a/Java4L8HW/src/alexrm84/HashTable.java b/Java4L8HW/src/alexrm84/HashTable.java new file mode 100644 index 0000000..cd6ecec --- /dev/null +++ b/Java4L8HW/src/alexrm84/HashTable.java @@ -0,0 +1,11 @@ +package alexrm84; + +public interface HashTable { + + boolean put(Item item, Integer cost); + Integer get(Item item); + boolean remove(Item item); + int getSize(); + boolean isEmpty(); + void display(); +} diff --git a/Java4L8HW/src/alexrm84/HashTableImplement.java b/Java4L8HW/src/alexrm84/HashTableImplement.java new file mode 100644 index 0000000..1fb7f75 --- /dev/null +++ b/Java4L8HW/src/alexrm84/HashTableImplement.java @@ -0,0 +1,112 @@ +package alexrm84; + + +public class HashTableImplement implements HashTable { + + public static final int INVALID_INDEX = -1; + public static final Integer INVALID_COST = null; + + class Entry{ + private Item key; + private int value; + + public Entry(Item key, int value) { + this.key = key; + this.value = value; + } + + @Override + public String toString() { + return "Entry{" + + "key=" + key + + ", value=" + value + + '}'; + } + } + + private Entry[] data; + private int size; + private int maxSize; + + public HashTableImplement(int maxSize) { + this.data = new Entry[maxSize*2]; + this.maxSize = maxSize; + } + + private int hashFunc(int key){ + return key % data.length; + } + + @Override + public boolean put(Item item, Integer cost) { + if (size==maxSize){ + return false; + } + int index = hashFunc(item.hashCode()); + while (data[index]!=null){ + index+=getStep(item.hashCode()); + index%=data.length; + } + data[index] = new Entry(item,cost); + return true; + } + + protected int getStep(int key){ + return 1; + } + + @Override + public Integer get(Item item) { + int index = indexOf(item); + if (index == INVALID_INDEX){ + return INVALID_COST; + }else { + return data[index].value; + } + } + + private int indexOf(Item item){ + int index = hashFunc(item.hashCode()); + int count=0; + while (data[index]!=null && count<=data.length){ + if (data[index].key.equals(item)){ + return index; + } + index+=getStep(item.hashCode()); + index%=data.length; + count++; + } + return INVALID_INDEX; + } + + @Override + public boolean remove(Item item) { + int index = indexOf(item); + if (index!=INVALID_INDEX){ + data[index]=null; + size--; + return true; + }else { + return false; + } + } + + @Override + public int getSize() { + return size; + } + + @Override + public boolean isEmpty() { + return size==0; + } + + @Override + public void display() { + System.out.println("------------------------------"); + for (int i = 0; i < data.length; i++) { + System.out.println(String.format("%d = [%s]",i,data[i])); + } + System.out.println("------------------------------"); + } +} diff --git a/Java4L8HW/src/alexrm84/Item.java b/Java4L8HW/src/alexrm84/Item.java new file mode 100644 index 0000000..89269d3 --- /dev/null +++ b/Java4L8HW/src/alexrm84/Item.java @@ -0,0 +1,44 @@ +package alexrm84; + +import java.util.Objects; + +public class Item { + + private final String title; + private final int id; + + public Item(int id, String title) { + this.title = title; + this.id = id; + } + + public String getTitle() { + return title; + } + + public int getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Item item = (Item) o; + return id == item.id && + Objects.equals(title, item.title); + } + + @Override + public int hashCode() { + return id;//Objects.hash(id); + } + + @Override + public String toString() { + return "Item{" + + "title='" + title + '\'' + + ", id=" + id + + '}'; + } +} diff --git a/Java4L8HW/src/alexrm84/Main.java b/Java4L8HW/src/alexrm84/Main.java new file mode 100644 index 0000000..918f639 --- /dev/null +++ b/Java4L8HW/src/alexrm84/Main.java @@ -0,0 +1,25 @@ +package alexrm84; + +public class Main { + + public static void main(String[] args) { + +// HashTable hashTable = new HashTableImplement(5); +// HashTable hashTable = new DoubleHashTableImplement(5); + HashTable hashTable = new ChainsHashTableImplement(5); + hashTable.put(new Item(1, "Orange"), 150); + hashTable.put(new Item(77, "Banana"), 100); + hashTable.put(new Item(62, "Lemon"), 250); + hashTable.put(new Item(21, "Potato"), 67); + hashTable.put(new Item(55, "Milk"), 120); + + System.out.println("Size is " + hashTable.getSize()); + hashTable.display(); + + System.out.println("Cost potato is " + hashTable.get(new Item(21, "Potato"))); + System.out.println("Cost Banana is " + hashTable.get(new Item(77, "Banana"))); + + hashTable.remove(new Item(77, "Banana")); + System.out.println("Cost Banana is " + hashTable.get(new Item(77, "Banana"))); + } +}