java - 如何在java中的数组列表中明智地存储数据列?
问题描述
大家好,我有一个 Map<String, List> 即字符串存储标题和对象列表分别存储它们的值。我想将数据一一存储在数组列表中,如下所示。
这是我要存储在数组列表中的数据格式:-
[ Pojo(foo1=636580, foo2=CIVIL, foo3=29/06/2021),
Pojo(foo1=636580, foo2=CIVIL, foo3=29/06/2021),
Pojo(foo1=636580, foo2=CIVIL, foo3=29/06/2021),
Pojo(foo1=636580, foo2=CIVIL, foo3=29/06/2021),
Pojo(foo1=636580, foo2=CIVIL, foo3=29/06/2021),
]
但数据存储为:
[
Pojo(foo1=636580, foo2=N/A, foo3=N/A),
Pojo(foo1=636580, foo2=N/A, foo3=N/A),
Pojo(foo1=636580, foo2=N/A, foo3=N/A),
Pojo(foo1=636580, foo2=N/A, foo3=N/A),
Pojo(foo1=636580, foo2=N/A, foo3=N/A),
Pojo(foo1=N/A, foo2=CIVIL , foo3=N/A),
Pojo(foo1=N/A, foo2=CIVIL , foo3=N/A),
Pojo(foo1=N/A, foo2=CIVIL , foo3=N/A),
Pojo(foo1=N/A, foo2=CIVIL , foo3=N/A),
Pojo(foo1=N/A, foo2=CIVIL , foo3=N/A),
Pojo(foo1=N/A, foo2=N/A, foo3=29/06/2021),
Pojo(foo1=N/A, foo2=N/A, foo3=29/06/2021),
Pojo(foo1=N/A, foo2=N/A, foo3=29/06/2021),
Pojo(foo1=N/A, foo2=N/A, foo3=29/06/2021),
Pojo(foo1=N/A, foo2=N/A, foo3=29/06/2021)
]
这是我的 pojo 课:-
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pojo {
private String foo1= "N/A";
private String foo2= "N/A";
private String foo3= "N/A";
}
这是我的代码:-
Map<String, List<Object>> myMap = new HashMap<>();
List<String> strings = new ArrayList<>();
strings.add("foo1");
strings.add("foo2");
strings.add("foo3");
List<Pojo> pojos = new ArrayList<>();
for (String string : strings) {
Pojo pojo = new Pojo();
for (Map.Entry<String, List<Object>> entry : myMap.entrySet()) {
int max = myMap.values().stream().map(List::size).max(Integer::compareTo).get() - 1;
if (entry.getKey().equalsIgnoreCase(string)) {
while (max >= 0) {
pojo = getPropertyValue(entry.getKey(), entry.getValue().get(max), pojo);
pojos.add(pojo);
max--;
}
}
}
}
System.out.println(pojos);
这是我的 getPropertyValue 方法:-
Class<?> unreconciledTransactionClass = Class.forName("com.example.looping.rohit.Pojo"); // convert string classname to class
Object data;
if (pojo != null) {
data = pojo;
} else {
data = unreconciledTransactionClass.getDeclaredConstructor().newInstance(); // invoke empty constructor
}
PropertyAccessor myAccessor = PropertyAccessorFactory.forBeanPropertyAccess(data);
myAccessor.setPropertyValue(attributeName, value);
return (Pojo) data;
}
解决方案
下面是应该解决您的问题的代码。我添加了一个 try/catch 块,以便在 myMap 中有不同大小的列表时处理这种情况。
int max = myMap.values().stream().map(List::size).max(Integer::compareTo).get();
List<Pojo> pojos = new ArrayList<>();
for(int i=0; i<max; i++) {
Pojo pojo = new Pojo();
for (String string : strings) {
String value;
try {
value = myMap.get(string).get(i);
}catch(IndexOutOfBoundsException e) {
value = "N/A";
}
pojo = getPropertyValue(string,value, pojo);
}
pojos.add(pojo);
}
推荐阅读
- javascript - 按iso字符串降序排序不起作用
- asp.net-mvc - 同一区域同名的控制器
- spring-boot - Spring Boot - 无法处理 IllegalStateException
- javascript - 如何在 JS 正则表达式中表示“iPhone10,3”、“iPhone10,6”、“iPhone11,2”、“iPhone11,4”、“iPhone11,8”中的任何一个
- typescript - 如何使用映射类型获取对象类型的可选部分?
- machine-learning - 如何使用python通过word2vec转换文本文件
- r - 如何保持图中点的相对大小相等?
- amazon-web-services - Slack 在使用 Amazon Lex 设置事件订阅 URL 时返回错误
- java - 五中之大
- python - 不兼容的形状:[14250,10] 与 [15000,10]