Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions Java4L8HW/src/alexrm84/ChainsHashTableImplement.java
Original file line number Diff line number Diff line change
@@ -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<Entry>[] 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("------------------------------");
}
}
18 changes: 18 additions & 0 deletions Java4L8HW/src/alexrm84/DoubleHashTableImplement.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
11 changes: 11 additions & 0 deletions Java4L8HW/src/alexrm84/HashTable.java
Original file line number Diff line number Diff line change
@@ -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();
}
112 changes: 112 additions & 0 deletions Java4L8HW/src/alexrm84/HashTableImplement.java
Original file line number Diff line number Diff line change
@@ -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("------------------------------");
}
}
44 changes: 44 additions & 0 deletions Java4L8HW/src/alexrm84/Item.java
Original file line number Diff line number Diff line change
@@ -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 +
'}';
}
}
25 changes: 25 additions & 0 deletions Java4L8HW/src/alexrm84/Main.java
Original file line number Diff line number Diff line change
@@ -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")));
}
}