如何使用Java

时间:2016-07-07 07:45:29

标签: java arraylist hashmap set

我遇到了使用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

6 个答案:

答案 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这样的库,其MultimapMap,可以为一个键保存多个值。

答案 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);
        }

    }
}