class SanMap implements Map {
private final static int slot = 997;
private LinkedList[] bucket = new LinkedList[slot];
int size = 0;
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean containsKey(Object key) {
int index = key.hashCode() % slot;
if (index < 0) index = -index;
if (bucket[index] == null) return false;
LinkedList linkedList = bucket[index];
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Data data = (Data) iterator.next();
if (data.getKey().equals(key)) {
return true;
}
}
return false;
}
@Override
public boolean containsValue(Object value) {
for (int i = 0; i < slot; i++) {
if (bucket[i] != null) {
LinkedList linkedList = bucket[i];
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Data data = (Data) iterator.next();
if (data.getValue().equals(value)) {
return true;
}
}
}
}
return false;
}
@Override
public Object get(Object key) {
Data datanow = new Data(key, null);
int index = key.hashCode() % slot;
if (index < 0) index = -index;
if (bucket[index] == null) return null;
LinkedList list = bucket[index];
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
Data data = (Data) iterator.next();
if (data.equals(datanow)) return data.getValue();
}
return null;
}
@Override
public Object put(Object key, Object value) {
Object result = null;
Data datanow = new Data(key, value);
int index = key.hashCode() % slot;
if (index < 0) index = -index;
if (bucket[index] == null) bucket[index] = new LinkedList();
LinkedList list = bucket[index];
ListIterator iterator = list.listIterator();
boolean found = false;
while (iterator.hasNext()) {
Data data = (Data) iterator.next();
if (data.equals(datanow)) {
found = true;
result = data.getValue();
iterator.set(datanow);
break;
}
}
if (!found) {
bucket[index].add(datanow);
size++;
}
return result;
}
@Override
public Object remove(Object key) {
int index = key.hashCode() % slot;
if (index < 0) index = -index;
if (bucket[index] == null) return null;
LinkedList linkedList = bucket[index];
size--;
return linkedList.remove(new Data(key, null));
}
@Override
public void putAll(Map m) {
Set set = m.entrySet();
for (Object o : set) {
Map.Entry oo = (Map.Entry) o;
put(oo.getKey(), oo.getValue());
}
}
@Override
public void clear() {
for (Object key : keySet()) {
remove(key);
}
size = 0;
}
@Override
public Set keySet() {
Set set = new HashSet();
for (int i = 0; i < slot; i++) {
if (bucket[i] != null) {
Iterator iterator = bucket[i].iterator();
while (iterator.hasNext()) {
set.add(((Data) iterator.next()).getKey());
}
}
}
return set;
}
@Override
public Collection values() {
List list = new ArrayList();
for (int i = 0; i < slot; i++) {
if (bucket[i] != null) {
Iterator iterator = bucket[i].iterator();
while (iterator.hasNext()) {
list.add(((Data) iterator.next()).getValue());
}
}
}
return list;
}
@Override
public Set<Entry> entrySet() {
Set entries = new HashSet();
for (int i = 0; i < bucket.length; i++) {
if (bucket[i] == null) continue;
ListIterator iterator = bucket[i].listIterator();
while (iterator.hasNext()) {
entries.add(iterator.next());
}
}
return entries;
}
@Override
public boolean equals(Object o) {
return false;
}
@Override
public int hashCode() {
int j = 0;
for (int i = 0; i < slot; i++) {
if (bucket[i] != null) {
Iterator iterator = bucket[i].iterator();
Data data = (Data) iterator.next();
j = j + data.getKey().hashCode();
}
}
return j;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("[ ");
for (int i = 0; i < slot; i++) {
if (bucket[i] != null) {
Iterator iterator = bucket[i].iterator();
while (iterator.hasNext()) {
Data data = (Data) iterator.next();
builder.append(data.getKey() + "=" + data.getValue() + " ");
}
}
}
builder.append("]");
return builder.toString();
}
}
class Data implements Map.Entry, Comparable {
private Object key, value;
Data(Object key, Object value) {
this.key = key;
this.value = value;
}
@Override
public int compareTo(Object o) {
Data data = (Data) o;
return ((Comparable) key).compareTo(data.key);
}
@Override
public boolean equals(Object obj) {
return key.equals(((Data) obj).key);
}
@Override
public Object getKey() {
return key;
}
@Override
public Object getValue() {
return value;
}
@Override
public Object setValue(Object value) {
Object result = this.value;
this.value = value;
return result;
}
@Override
public String toString() {
return key + "=" + value;
}
}
自己写一个Map (实现Map接口并利用散列原理)
猜你喜欢
转载自blog.csdn.net/weixin_38967434/article/details/82316979
今日推荐
周排行