允许重复键以及维护插入顺序的映射

时间:2016-02-01 11:13:02

标签: java

目前我正在使用LinkedHashMap来维护广告订单。

我使用的LinkedHashMap的语法:

private LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("R1", "Data1");   
linkedHashMap.put("R2", "Data2");
linkedHashMap.put("R3", "Data3");
linkedHashMap.put("R4", "Data4");

哪个工作正常。但我必须使用重复键,并且还保留了插入数据。

例如:

private LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("R1", "Data1");   
linkedHashMap.put("R2", "Data2");
linkedHashMap.put("R1", "Data3");
linkedHashMap.put("R2", "Data4");

当我试图在linkedHaphMap中保留重复数据时,它会删除重复数据并只保留一个数据。

那么如何在java中插入重复数据并维护插入顺序?实现我案子的方法是什么?

3 个答案:

答案 0 :(得分:4)

试试这个:

public class Test {

    public static void main(String[] args) {
        Map<String, List<String>> map = new LinkedHashMap<>();
        put(map, "R1", "Data1");
        put(map, "R2", "Data2");
        put(map, "R1", "Data3");
        put(map, "R2", "Data4");

        System.out.println(map); // prints {R1=[Data1, Data3], R2=[Data2, Data4]}
    }

    public static void put(Map<String, List<String>> map, String key, String value) {
        if (map.get(key) == null) {
            List<String> list = new ArrayList<>();
            list.add(value);
            map.put(key, list);
        } else {
            map.get(key).add(value);
        }
    }
}

答案 1 :(得分:0)

为数据使用复合模式。简单的例子看起来像这样。

public class Container{
    String value;
    ArrayList<String> list = null;

    public Container(String value){
        this.value = value;
    }

    public void add(String newvalue){
         if (list == null){
             list = new ArrayList();
             list.add(value);
             list.add(newvalue);
         }else{
             list.add(newvalue);
         }
    }
    public boolean isSingleValue(){
         return list==null;
    }
    public Iterator<String> getOrderedList(){
          return list.iterator();
    }
    public String getValue(){
          return value;
    }

这样,您的地图可以包含单个元素以及元素列表。您可以使用如下:

if (map.containsKey(key)){
   map.get(key).add(value);
}else{
   map.put(key,new Container(value))
}

答案 2 :(得分:0)

private LinkedHashMap<String, List<String>> linkedHashMap = new LinkedHashMap<String, List<String>>();

put("R1", "Data1");   
put("R2", "Data2");
put("R1", "Data3");
put("R2", "Data4");

private void put(String key, String value){
    if(linkedHashMap.get(key) == null){
        linkedHashMap.put(key, new ArrayList<String>());
    }
    linkedHashMap.get(key).add(value);
}

private boolean isDuplicate(String key){
    return (linkedHashMap.get(key).size()>1)
}