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

Java 如何将ArrayList的ArrayList中的值与hashmap中的值相同,java,Java,我有一个ArrayList of ArrayList of String,其中包含以下值: {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',

我有一个ArrayList of ArrayList of String,其中包含以下值:

{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']}
以下代码的输出在multiMap中创建为:

代码:


查看数据的结构,您可能会有一个
,该类包含
字符串名称、电话、发货
字段。我创建了一个
DTO
类:

@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);
// 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);

更新: 因为不允许您使用
。我正在使用
Map
重写相同的功能。下面是我编写的一个实用方法,它将返回一个包含以下值的
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;
}
private static Map createMap(字符串名称、字符串电话、字符串传送){
Map Map=新的HashMap(3);
地图。放置(“名称”,名称);
地图。放置(“电话”,电话);
地图放置(“装运”,装运);
返回图;
}
下面是我如何测试它的:

// 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);
// 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);
//伪数据
List materialData=new ArrayList();
添加(createMap(“数据1”、“123”、“位置1”);
添加(createMap(“数据1”、“456”、“位置2”);
添加(createMap(“数据1”、“678”、“位置3”);
添加(createMap(“数据2”、“222”、“位置4”);
添加(createMap(“数据2”、“111”、“位置5”);
添加(createMap(“数据3”、“555”、“位置6”);
//按DTO类中的“名称”字段分组
Map multiMap=materialData.stream().collect(Collectors.groupingBy(Map->Map.get(“name”));
//打印结果
System.out.println(多重映射);
输出与上述相同


下面是创建
地图的方法。只需在
=>
上拆分
字符串,并将其拆分为
元素列表
。进一步
拆分
以获得所需的
,并放入
映射
。如果在
Map
中找到给定的键,只需针对
键添加元素,依此类推

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

您正在初始化
ArrayList materialData=new ArrayList()作为空列表。在for循环中,
materialData.size()
是0,这是因为我需要一个arraylist的arraylist,该arraylist只具有相同的值,名为data1、data2,…如果有其他更好的方法,将消耗更少的执行时间,将更有帮助..在查看示例输入后,应该有arraylist materialData1=new arraylist();而不是ArrayList materialData=new ArrayList();这是地图的地图这段代码非常好,非常感谢您的努力,但我的项目不允许我使用class。@YaseerHussain您能使用
map
?问题是字符串与我的错误匹配,我尝试了sh.equals(materialData.get(i).get(1)).toString(),它开始添加数据,但是有没有更好的方法来编写这段代码呢?你能帮我用MAP来编写代码吗?我会试试that@YaseerHussain我已经更新了我的答案。请参阅答案的更新部分。
// 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);
  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 );
    });
}
  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']