繁体   English   中英

如何将 Arraylist 的 ArrayList 中的值与 hashmap 中的值相同

[英]How to put values from ArrayList of Arraylist with same value in hashmap

我有一个 ArrayList 的 ArrayList ,它具有以下值:

{0=>[name:'data1',phone:'123',shipping:'location1'],  
1=>[name:'data1',phone:'456',shipping:'location2'],  
2=>[name:'data1',phone:'678',shipping:'location3'],  
3=>[name:'data2',phone:'222',shipping:'location4'],  
4=>[name:'data2',phone:'111',shipping:'location5'],  
5=>[name:'data3',phone:'555',shipping:'location6']}

以下代码的 output 在multiMap中将 output 分类为:

{data1=[],data2=[],data3=[]}

代码:

ArrayList<String> shards = new ArrayList<String>(); // contains unique values like data1,data2,..
ArrayList<ArrayList<String>> materialData = new ArrayList<ArrayList<String>>();
HashMap<String, ArrayList<ArrayList<String>>> multiMap = new HashMap<String, ArrayList<ArrayList<String>>>();


for(String sh : shards) {
    ArrayList<ArrayList<String>> materialDataPush = new ArrayList<ArrayList<String>>();
    for (int i = 0; i < materialData.size(); i++) {
        if(sh == (materialData.get(i).get(1)).toString()){
            materialDataPush.add(materialData.get(i));
        }
    }
    multiMap.put(sh,materialDataPush);
}

预期的 output 应如下所示:

(
data1=>{
    0=>[name:"data1",phone:"123",shipping:"location1"],
    1=>[name:"data1",phone:"456",shipping:"location2"],
    2=>[name:"data1",phone:"678",shipping:"location3"]
    },
data2=>{
    0=>[name:"data2",phone:"222",shipping:"location4"],
    1=>[name:"data2",phone:"111",shipping:"location5"]
},
data3=>{
    0=>[name:"data3",phone:"555",shipping:"location6"]
})

查看数据的结构,您可能会拥有一个class ,其中包含String name, phone, shipping字段。 我创建了一个DTO class:

@Data // Lombok
public class DTO {
    private String name;
    private String phone;
    private String shipping;

    DTO() { }

    DTO(String name, String phone, String shipping) {
        this.name = name;
        this.phone = phone;
        this.shipping = shipping;
    }

    // getter/setters ommitted because of @Data
}

这是我测试它的方法:

// Dummy Data (as described in question)
List<DTO> materialData = new ArrayList<>();
materialData.add(new DTO("data1", "123", "location1"));
materialData.add(new DTO("data1", "456", "location2"));
materialData.add(new DTO("data1", "678", "location3"));
materialData.add(new DTO("data2", "222", "location4"));
materialData.add(new DTO("data2", "111", "location5"));
materialData.add(new DTO("data3", "555", "location6"));

// Grouping by `name` field in DTO class
Map<String, List<DTO>> multiMap = materialData.stream().collect(Collectors.groupingBy(DTO::getName));

// Printing the results
System.out.println(multiMap);

Output(格式化 JSON):

{
  "data3": [
    {
      "name": "data3",
      "phone": "555",
      "shipping": "location6"
    }
  ],
  "data2": [
    {
      "name": "data2",
      "phone": "222",
      "shipping": "location4"
    },
    {
      "name": "data2",
      "phone": "111",
      "shipping": "location5"
    }
  ],
  "data1": [
    {
      "name": "data1",
      "phone": "123",
      "shipping": "location1"
    },
    {
      "name": "data1",
      "phone": "456",
      "shipping": "location2"
    },
    {
      "name": "data1",
      "phone": "678",
      "shipping": "location3"
    }
  ]
}

更新:

由于您不允许使用class 我正在使用Map<String, String>重写相同的功能。 这是我编写的一个实用方法,它将返回包含这些值的Map

private static Map<String, String> createMap(String name, String phone, String shipping) {
    Map<String, String> map = new HashMap<>(3);
    map.put("name", name);
    map.put("phone", phone);
    map.put("shipping", shipping);
    return map;
}

这是我测试它的方法:

// Dummy Data
List<Map<String, String>> materialData = new ArrayList<>();
materialData.add(createMap("data1", "123", "location1"));
materialData.add(createMap("data1", "456", "location2"));
materialData.add(createMap("data1", "678", "location3"));
materialData.add(createMap("data2", "222", "location4"));
materialData.add(createMap("data2", "111", "location5"));
materialData.add(createMap("data3", "555", "location6"));

// Grouping by `name` field in DTO class
Map<String, List<Map<String, String>>> multiMap = materialData.stream().collect(Collectors.groupingBy(map -> map.get("name")));

// Printing the results
System.out.println(multiMap);

output 与上述相同。

这是创建Map的方法。 只需将您的字符串split=>并分解为elements列表。 进一步split以获得所需的keyvalue并放入Map 如果在Map中找到给定的密钥,只需添加针对keys的元素等等。

  public static void main(String[] args) {

    String str = "{0=>[name:'data1',phone:'123',shipping:'location1'],  \n" + 
            "1=>[name:'data1',phone:'456',shipping:'location2'],  \n" + 
            "2=>[name:'data1',phone:'678',shipping:'location3'],  \n" + 
            "3=>[name:'data2',phone:'222',shipping:'location4'],  \n" + 
            "4=>[name:'data2',phone:'111',shipping:'location5'],  \n" + 
            "5=>[name:'data3',phone:'555',shipping:'location6']}";
    HashMap<String,List<String>> result = new HashMap<String,List<String>>();
    for (String string : str.split("=>")) {
         String s = string;
         Pattern p = Pattern.compile("\\[.*?\\]");
         Matcher m = p.matcher(s);
         if(m.find()) {
             String element = (String) m.group().subSequence(1, m.group().length()-1);
            String key = element.split(":")[1].split(",")[0].replaceAll("'", "");// I am assuming you are not using any serialization API
             if(result.get(key) == null) {
                 List<String> val=new ArrayList<String>();
                 val.add(element);
                 result.put(key, val);
             }else {
                List<String> values= result.get(key); 
                values.add(element);
             }
         }
    }

    result.forEach((k,v)->{
        System.out.println(k+"  => "+v );
    });
}

这是样品 output

  data3  => [name:'data3',phone:'555',shipping:'location6']
  data2  => [name:'data2',phone:'222',shipping:'location4',  name:'data2',phone:'111',shipping:'location5']
  data1  => [name:'data1',phone:'123',shipping:'location1', name:'data1',phone:'456',shipping:'location2', name:'data1',phone:'678',shipping:'location3']

这是示例应用程序的 URL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM