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库,我想不出现成的解决方案,您应该使用第三方库。不管怎样,如果你解决了原来的问题,请考虑选出你的最佳答案。