我遇到了使用java检索数据的问题。任何人都可以指导我如何找到它的解决方案。
Map<String,String> map = new HashMap<String,String>();
map.put("8004","Lead");
map.put("8004","Opportunity");
map.put("8004","Quote");
map.put("8004","Contract");
map.put("8005","CreatContract" );
map.put("8005","ManageContract" );
map.put("8005","SelectContract" );
//System.out.println(map);
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
//boolean blnExists = map.containsValue(pair.getValue());
System.out.println(pair.getKey() + " = " + pair.getValue());
}
输出:
8004 = Contract
8005 = SelectContract
预期输出:
8004 = lead,opportunity,Quote
8005 = CreateContracr,ManageContract
答案 0 :(得分:2)
当地图中已有针对给定密钥的条目时,如果您在put
上致电HashMap
,则您传递的值将替换该键的地图。所以,如果你这样做:
map.put("8004","Lead");
map.put("8004","Opportunity");
然后第二个put
将覆盖第一个put
的值。如果地图已经包含值,您必须检查自己,如果有,则附加新值。例如,编写实用程序方法:
public void putAppend(Map<String, String> map, String key, String value) {
if (map.containsKey(key)) {
map.put(key, map.get(key) + "," + value);
} else {
map.put(key, value);
}
}
然后使用它:
putAppend(map, "8004", "Lead");
putAppend(map, "8004", "Opportunity");
如果您希望该值实际上是List
而不是String
,请相应地更改地图:
Map<String, List<String>> map = new HashMap<>();
并使putAppend
方法看起来像这样:
public void putAppend(Map<String, List<String>> map, String key, String value) {
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
map.put(key, map.get(key).add(value));
}
如果您使用的是Java 8,则可以使用computeIfAbsent
和lambda表达式:
public void putAppend(Map<String, List<String>> map, String key, String value) {
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
您还可以使用Google Guava这样的库,其Multimap
为Map
,可以为一个键保存多个值。
答案 1 :(得分:1)
public HashMap<String, String> extendKeyValuePairForHashMap(HashMap<String, String> hashMap, String key, String value) {
if (hashMap.containsKey(key)) {
hashMap.put(key, hashMap.get(key) + ", " + value);
} else {
hashMap.put(key, value);
}
return hashMap;
}
如果密钥匹配, HashMap.put()
将使用指定的新密钥值值替换任何当前密钥值对。但是你想扩展它,所以你需要检查密钥是否存在,如果存在,那么你需要得到所说的当前值,添加你的新值并将其放入HashMap
答案 2 :(得分:1)
如果您确实需要Map<String, String>
,其中值是以逗号分隔的值列表,那么您可以使用Map.merge
而不是Map.put
:
map.merge("8004", "Lead", (l, r) -> l + "," + r);
如果您想要一个更合理的数据结构,那么使用Map<String, Set<String>>
会更好,因为您存储单个项目,而不是之后必须split
,在这种情况下,使用{{1 }}:
Map.computeIfAbsent
答案 3 :(得分:0)
HashMap将您的结果存储为一对Key - Value。每当您的商店成为新货币对时,如果该密钥已存在,则将其替换。 这就是为什么你只有与键对应的最后一个元素。
你想要的是:
foreach ($graph_lines as $line) {
if($line){
$output .= '<li>';
$output .= $image;
$output .= $line;
$output .= ';';
if (next($graph_lines)==false) $output .= '.';//not sure where you put it.
$output .= '</li>';
}
}
答案 4 :(得分:0)
使用guava中的MultiMap
而不是Map,在其中你可以在一个键中存储多个值(我还使用了foreach循环代替你拥有的迭代器):
Multimap<String, String> map = ArrayListMultimap.create();
map.put("8004","Lead");
map.put("8004","Opportunity");
map.put("8004","Quote");
map.put("8004","Contract");
map.put("8005","CreatContract" );
map.put("8005","ManageContract" );
map.put("8005","SelectContract" );
//System.out.println(map);
for (Map.Entry<String, String> pair : map.entries()) {
System.out.println(pair.getKey() + " = " + pair.getValue());
}
答案 5 :(得分:0)
您需要创建Map<String, List<String>> map = new HashMap<>();
。 Plaese看起来在片段下面:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Test {
private static Map<String, List<String>> map = new HashMap<>();
public static void main(String args[]){
addDataToMap("8004","Lead");
addDataToMap("8004","Opportunity");
addDataToMap("8004","Quote");
addDataToMap("8004","Contract");
addDataToMap("8005","CreatContract" );
addDataToMap("8005","ManageContract" );
addDataToMap("8005","SelectContract" );
Iterator<Entry<String, List<String>>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
}
}
public static void addDataToMap(final String key, final String value){
if(map.containsKey(key)){
List<String> values = map.get(key);
values.add(value);
}else{
List<String> values = new ArrayList<>();
values.add(value);
map.put(key, values);
}
}
}