我需要一个同时是 HashMap 和 ArrayList 的类。
为什么我需要 HashMap?根据密钥快速访问对象。
为什么需要 ArrayList?随机选择一个元素。
你知道如何解决这个问题吗?书架上有现成的课程吗?
至于现在我想到的唯一解决方案是使用 ArrayList。那么随机访问就是小菜一碟。对于基于键选择对象,仅使用简单的迭代器是一种解决方案,但远非完美......
您可以使用组合:
public class HashedList<K, V> {
private final List<V> list = new ArrayList<>();
private final Map<K, V> map = new HashMap<>();
protected K getKey(V val);
public void add(V value) {
list.add(value);
map.put(getKey(value), value);
}
public V get(int index) {
return list.get(index);
}
public V get(K key) {
return map.get(key);
}
}
为什么两者都需要?用例是什么?
如果您的键是数字(整数),那么只需使用ArrayList
如果您的密钥不是数字,并且您的随机访问是通过非数字密钥,请使用HashMap
否则,如果您需要通过(非数字)键和插入索引进行访问,您可能需要通过实现 Map 和 List 接口来创建自己的数据结构,该结构同时具有 ArrayList 和 HashMap。(它将同时具有 anArrayList
和 aHashMap
成员,并且您必须在添加/删除等时同时更新,尽管某些情况下会有不确定的定义,例如当按键删除一个项目时,您是否移动其他项目的索引ETC...)
如果您想要的只是维护插入顺序,那么LinkedHashMap可能是一个很好的内置解决方案。
关键问题是为什么需要这种数据结构?这样我们也许能够更好地提出解决方案。
我会说简单的使用数组。我错过了什么吗?
如果您的键可以用作数组的索引,则可以使用数组。否则 HashMap 似乎是解决方案。
为什么我需要 HashMap?根据密钥快速访问对象。
逻辑原因。
为什么需要 ArrayList?随机选择一个元素。
不那么强大:您在 ArrayList 中随机选择元素的逻辑可能也可以用于 HashMap 的 entrySet ...