java HashMap和ArrayList合一

java HashMap和ArrayList合一,java,arraylist,hashmap,Java,Arraylist,Hashmap,我需要一个类同时是HashMap和ArrayList 为什么我需要HashMap?以基于键快速访问对象 为什么我需要ArrayList?随机选择一个元素 你知道怎么解决这个问题吗?架子上有现成的课吗 至于现在,我想到的唯一解决办法是使用ArrayList。那么随机访问就是小菜一碟了。对于基于键选择对象来说,仅仅使用一个简单的迭代器是一种解决方案,但远不是完美的….为什么两者都需要?用例是什么 如果键是数字(整数),则只需使用ArrayList 如果您的密钥不是数字,并且您的随机访问是通过非数字密

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

为什么我需要HashMap?以基于键快速访问对象

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

你知道怎么解决这个问题吗?架子上有现成的课吗


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

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

如果键是数字(整数),则只需使用
ArrayList

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

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

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

关键问题是为什么需要这种数据结构?这样我们就可以更好地提出解决方案

为什么我需要HashMap?基于 钥匙

逻辑推理

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


不是很强:在ArrayList中随机选择元素的逻辑可能也可以用于HashMap的entrySet…

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

如果密钥可以用作数组的索引,则可以使用数组。否则,哈希映射似乎就是解决方案

您可以使用组合:

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);
    }
}
公共类HashedList{
私有最终列表=新的ArrayList();
私有最终映射=新HashMap();
受保护的K getKey(V val);
公共无效添加(V值){
列表。添加(值);
map.put(getKey(value),value);
}
公共V get(int索引){
返回列表。获取(索引);
}
公共V get(K键){
返回map.get(key);
}
}

问题中没有提到他想维护插入顺序。随机访问是所需要的。此外,您能解释一下您的数据结构吗?@Jatin很好,我唯一需要列表和映射的时候是为了维护插入顺序,或者当我需要更类似于数据库表结构的东西时(例如,通过字符串键和数字记录ID进行访问)。在不知道用例的情况下,我不知道OP的意思是什么。添加了一些关于数据结构的说明。原则上,它应该或多或少类似于
LinkedHashMap
,但使用ArrayList而不是LinkedList。我不认为这是一个特别好的数据结构,它可能有很多边缘情况,但它肯定是可行的。我认为您应该放一些示例代码来给出更完整的答案。使用一个HashMap和随机访问的find方法就足够了吗?Random()?你的
键是什么类型的
?这个问题太模糊了,可能太复杂了,没有真正的原因。更神秘的是这个问题有4张赞成票……如果地图已经填充,那么只需将值转储到
数组列表
,然后使用该列表进行随机选择。IMO不需要混合容器。但也许你可以详细说明你将此应用于什么使用场景。我认为你是对的,除非OP有其他要求(尚未说明)。@PM77-1非常正确。如果同时分析map也构建在数组的顶部,arraylist也构建在数组的顶部。@PM77-1数组可能是一个包含键和值的元素数组。数组数组不能通过键进行快速访问。然后是
HashMap
。我喜欢(现在仍然喜欢)您的原始解决方案。你得到了我的支持票。我相信HasMap基于数组这一事实在这里并不重要。似乎OP希望同时使用非数字键和插入索引。ArrayList或HashMap都不能单独回答这个问题,Jeffery的回答似乎是回答这两个问题的正确方法。@EranMedan-除非你是读心术者或与OP有私人交流,否则我看不出任何结论的依据。@Eran因为问题不清楚,我们不能说哪个答案是最好的,也许类似的东西似乎是最好的主意(两个列表保存在内存中)。