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