Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在地图中具有多个值的键?_Java_Map - Fatal编程技术网

Java 如何在地图中具有多个值的键?

Java 如何在地图中具有多个值的键?,java,map,Java,Map,我有一张这样的地图 Map map=new HashMap();//HashMap key random order. map.put("a",10); map.put("a",20); map.put("a",30); map.put("b",10); System.out.println("There are "+map.size()+" elements in the map."); System.out.println("Content of Map are..."); Set s=m

我有一张这样的地图

Map map=new HashMap();//HashMap key random order.
map.put("a",10);
map.put("a",20);
map.put("a",30);
map.put("b",10);

System.out.println("There are "+map.size()+" elements in the map.");
System.out.println("Content of Map are...");
Set s=map.entrySet();
Iterator itr=s.iterator();
while(itr.hasNext())
{
    Map.Entry m=(Map.Entry)itr.next();
    System.out.println(m.getKey()+"\t"+m.getValue()+"\t"+ m.hashCode());
}
上述程序的输出为

地图中有2个元素。
地图的内容是。。。
b 10 104
a 30 127
现在我希望键a应该有多个值,比如

a10
a 20
a 30
所以我应该得到a所关联的所有值。请告知我如何才能实现同样的目标。通过嵌套集合,我希望键“a”具有所有三个值。

您签出了吗

类似于映射的集合,但可以关联多个值 用一把钥匙。如果用相同的键调用put(K,V)两次,但是 不同的值,多重映射包含从键到键和键的映射 价值观

如果您确实想使用标准集合(如下所示),则必须为每个键存储一个集合,例如

map = new HashMap<String, Collection<Integer>>();
map=newhashmap();

请注意,第一次输入新键时,必须在添加第一个值之前创建新集合(
List
Set
等)。

在值部分放置一个
ArrayList
实例

void addValue(Map map, Object key, Object value) {
    Object obj = map.get(key);
    List list;
    if (obj == null) {  
        list = new ArrayList<Object>();  
    } else {
        list = ((ArrayList) obj);
    }
    list.add(value);
    map.put(key, list);
}
void addValue(贴图、对象键、对象值){
Object obj=map.get(key);
名单;
如果(obj==null){
列表=新的ArrayList();
}否则{
列表=((ArrayList)obj);
}
列表。添加(值);
地图。放置(键、列表);
}

查看更多信息。

使用带有值类型的映射作为值列表。例如,在您的映射中,添加条目时,您将把键设置为“a”,并且必须将其值添加为整数列表,具有所有必需的值,如1、2、3、4。

您不应忽略通用参数。你所拥有的是

Map<String, Integer> map = new HashMap<>();
Map Map=newhashmap();
如果您想自己编写解决方案,您需要

Map<String, List<Integer>> map = new HashMap<>();
Map Map=newhashmap();

无论如何,首选的方法是使用一个

来实现您希望使用的Java标准库,我将使用如下映射:

Map<String, Collection<Integer>> multiValueMap = new HashMap<String, Collection<Integer>>();
Map multiValueMap=newhashmap();
然后可以添加值:

multiValueMap.put("a", new ArrayList<Integer>());
multiValueMap.get("a").add(new Integer(10));
multiValueMap.get("a").add(new Integer(20));
multiValueMap.get("a").add(new Integer(30));
multiValueMap.put(“a”,新的ArrayList());
multiValueMap.get(“a”).add(新的整数(10));
multiValueMap.get(“a”).add(新的整数(20));
multiValueMap.get(“a”).add(新的整数(30));

如果这个结果对你来说不舒服,考虑把这个行为包在一个专用的类中,或者使用另一个第三方解决方案,正如其他人在这里建议的那样(./P>>P>对于具有相同关键字的条目,没有意义使用<代码> GET())/代码>但是只要使用<代码>迭代器()/代码>或<代码>入口集()/<代码>,就应该起作用:

class HashMap<String, String> {

  Set<Entry<String, String>> entries;
  @Override
  public Set<Entry<String, String>> entrySet() {
    return entries;
  }

  @Override
  public int size() {
    return entries.size();
  }

  public String put(String key, String value) {
    if (entries == null) {
      entries = new AbstractSet<Entry<String, String>>() {

        ArrayList<Entry<String, String>> list = new ArrayList<>();
        @Override
        public Iterator<Entry<String, String>> iterator() {
          return list.iterator();
        }

        @Override
        public int size() {
          return list.size();
        }

        @Override
        public boolean add(Entry<String, String> stringStringEntry) {
          return list.add(stringStringEntry);
        }
      };
    }
    StatusHandler.MyEntry entry = new StatusHandler.MyEntry();
    entry.setKey(key);
    entry.setValue(value);
    entries.add(entry);
    return value;
  }
};
类HashMap{
设置条目;
@凌驾
公共集入口集(){
返回条目;
}
@凌驾
公共整数大小(){
返回条目。size();
}
公共字符串put(字符串键、字符串值){
if(条目==null){
条目=新的抽象集(){
ArrayList=新建ArrayList();
@凌驾
公共迭代器迭代器(){
return list.iterator();
}
@凌驾
公共整数大小(){
返回list.size();
}
@凌驾
公共布尔添加(条目stringentry){
返回列表。添加(StringEntry);
}
};
}
StatusHandler.MyEntry条目=新建StatusHandler.MyEntry();
entry.setKey(key);
entry.setValue(值);
条目。添加(条目);
返回值;
}
};
TL;苏博士,它有什么用处?这源于对java api进行重新挖掘以接受基于表单参数的复杂查询的黑客攻击:


我在查看java本身,请告知javaGuava是一个广泛使用的java库。不过,请注意我的上述评论。mapsHi D3EP4K中的集合请发布代码,以便更清楚地理解将此函数放入代码中,并根据问题中提到的方法调用addValue(map,new String(“a”),new Integer(10)),而不是调用map.put(“a”,10),新值替换了旧值。Hi think01它在添加一些与铸造相关的内容时抛出complile time错误,请通知我忘记了通用映射声明,现在它是正确的。让我们试着让我知道。是的,它很有效,非常感谢!!但是,难道没有其他方法可以避免数组列表吗。。!!对于标准Java库,我想不出现成的解决方案,您应该使用第三方库。不管怎样,如果你解决了原来的问题,请考虑选出你的最佳答案。