【发布时间】:2020-07-22 15:14:29
【问题描述】:
所以我正在尝试实现我自己的 Map 以了解它是如何工作的。 我之前通过在我的实现中创建了 2 个私有列表来做到这一点,但我被告知要使用和 Entry 类。所以我现在的主要问题是如何比较存储在列表中的条目的键?这是我的代码
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public class CorrectMapImpl implements Map {
private List<Entry> entries = new ArrayList<>();
@Override
public Object put(Object key, Object value) {
Entry entry = new Entry(key, value);
if (entries.contains(entry)) {
int index = entries.indexOf(entry);
entries.set(index, (Entry) value);
}else if(entries.contains()){
} else {
entries.add(entry);
};
return entry.getValue();
}
@Override
public Object get(Object key) {
//return entries.stream().filter(e -> e.getKey().equals(key)).findFirst().orElse(null).getValue();
/*Optional<Entry> optionalEntry = entries.stream().filter(e -> e.getKey().equals(key)).findFirst();
optionalEntry.ifPresent(Entry::getValue);
return optionalEntry;*/
}
@Override
public int size() {
return entries.size();
}
@Override
public Object remove(Object key) {
boolean hasKey = false;
int keyIndex = 0;
for(Entry entry: entries) {
if(entry.getKey().equals(key)) {
hasKey = true;
break;
}
keyIndex++;
}
if(hasKey) {
return entries.remove(keyIndex).getValue();
}
return null;
}
//---------------------------------------------------------------------------------------------
class Entry {
private Object key;
private Object value;
public Entry(Object key, Object value) {
this.key = key;
this.value = value;
}
public Object getKey() {
return key;
}
public void setKey(Object key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Entry)) return false;
Entry entry = (Entry) o;
return Objects.equals(key, entry.key) &&
Objects.equals(value, entry.value);
}
@Override
public int hashCode() {
return Objects.hash(key, value);
}
}
} “put”没有完整地写出来。我添加了“else if”,因为没有它“put”没有测试相同键/不同值的条目,只有当条目的实例完全相同时,键和值。当我尝试 entry.put 一个具有相同键但值不同的条目的新实例时,它不会像必须那样覆盖具有相同键的条目的前一个实例,而是添加一个新实例,因此大小为列表递增。 “get”实现也不起作用。第一条语句抛出 NullPointerException,另一条则提示对象的类,如 (CorrectMapImpl$Entry@cd440b02),而不是设置为键的值。
【问题讨论】:
标签: java implementation