簡體   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