3

我需要一个同时是 HashMap 和 ArrayList 的类。

为什么我需要 HashMap?根据密钥快速访问对象。

为什么需要 ArrayList?随机选择一个元素。

你知道如何解决这个问题吗?书架上有现成的课程吗?

至于现在我想到的唯一解决方案是使用 ArrayList。那么随机访问就是小菜一碟。对于基于键选择对象,仅使用简单的迭代器是一种解决方案,但远非完美......

4

5 回答 5

6

您可以使用组合:

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);
    }
}
于 2013-11-04T19:57:37.057 回答
0

为什么两者都需要?用例是什么?

如果您的键是数字(整数),那么只需使用ArrayList

如果您的密钥不是数字,并且您的随机访问是通过非数字密钥,请使用HashMap

否则,如果您需要通过(非数字)键和插入索引进行访问,您可能需要通过实现 Map 和 List 接口来创建自己的数据结构,该结构同时具有 ArrayList 和 HashMap。(它将同时具有 anArrayList和 aHashMap成员,并且您必须在添加/删除等时同时更新,尽管某些情况下会有不确定的定义,例如当按键删除一个项目时,您是否移动其他项目的索引ETC...)

如果您想要的只是维护插入顺序,那么LinkedHashMap可能是一个很好的内置解决方案。

关键问题是为什么需要这种数据结构?这样我们也许能够更好地提出解决方案。

于 2013-11-04T19:39:23.007 回答
0

我会说简单的使用数组。我错过了什么吗?

于 2013-11-04T19:46:02.997 回答
0

如果您的键可以用作数组的索引,则可以使用数组。否则 HashMap 似乎是解决方案。

于 2013-11-04T19:48:44.070 回答
-1

为什么我需要 HashMap?根据密钥快速访问对象。

逻辑原因。

为什么需要 ArrayList?随机选择一个元素。

不那么强大:您在 ArrayList 中随机选择元素的逻辑可能也可以用于 HashMap 的 entrySet ...

于 2013-11-04T19:42:54.493 回答