[英]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
以获得所需的key
和value
并放入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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.