我使用java 1.6。 我在ArrayList上有一个迭代器。对于每个Java Bean,它以下面的格式返回值。
id="my_Bean" name="my Bean" value="Red"
对于每次迭代,我可能会得到相同的id&具有不同“价值”的名称。
我想将它转换为HashMap(可能),它应该给我以下格式的值。
collection= { {id= "my_Bean", name= "my Bean", values= ["Red", "Blue", "Green"]}, .....& so on.. }
我无法为它编写逻辑。任何帮助都会很棒。
答案 0 :(得分:1)
您可以在HashMap中使用复合键<>添加你的bean对象。我在你的bean中添加了values
,它是同一个bean的value
的列表,其id和名称相同。
以下是代码:
HashMap<String, My_Bean> hashMap = new HashMap<String, My_Bean>();
for(int i=0;i<elist.size();i++)
{
My_Bean obj = elist.get(i);
String key = obj.getId()+"-"+obj.getName();
if(hashMap.containsKey(key)){
List<String> values = hashMap.get(key).getValues();
if(values != null) {
hashMap.get(key).getValues().add(obj.getValue());
}else{
hashMap.get(key).setValues(new ArrayList<String>());
hashMap.get(key).getValues().add(obj.getValue());
}
}
else{
hashMap.put(key, obj);
hashMap.get(key).setValues(new ArrayList<String>());
hashMap.get(key).getValues().add(obj.getValue());
}
}
这里elist
是bean对象的列表。我已经迭代你的bean列表并将bean对象添加到HashMap,如果不存在键(id-name
的组合)与添加新值列表和当前bean的value
值,如果bean已经然后取值列表并为该列表添加值。
我希望这是你需要的。
答案 1 :(得分:0)
您可以通过这种方式为地图制作按键
String key = id + "-" + name;
答案 2 :(得分:0)
假设您的bean有吸气剂,可能会使用以下方法。使用了一个复合键,Map
的值为List<Bean>
(如果需要的话,显然可能是List<String>
s。)
所以,我会使用循环并收集所有值,然后使用复合键。一种方法是使用Pair
中的commons-lang3
类:
final Map<Pair<String, String>, List<Bean>> map = new HashMap<Pair<String, String>, List<Bean>>();
for (final Iterator<Bean> itr = beans.iterator(); itr.hasNext(); ) {
Bean bean = itr.next();
final Pair<String, String> key = Pair.of(bean.getId(), bean.getName());
List<Bean> value = map.get(key);
if (value != null) {
value = new ArrayList<Bean>();
map.put(key, value);
}
value.add(bean);
}
在您的Maven POM或类似内容中,导入以下工件:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
如果您不知道您的ID和名称会是什么样,那么这种方法是安全的。如果您的密钥是包含字母-
复合键不应该是“id +” - “+ name”。
另请注意,有许多库提供Pair
- 类或类似的。有时,该课程可能被称为Tuple
。
答案 3 :(得分:0)
可能这是一个解决方案:
我假设您的对象字段中有getter / setter。
使bean的value字段也是一个ArrayList,在迭代步骤中你可以这样做:
// Create collection which will store the duplicates (which have same name and id)
Map collection = new HashMap<String, ArrayList>();
for(referenceElement:yourArrayList){
for(nextElement:yourArrayList){
if(referenceElement.getId==nextElement.getId
&&referenceElement.getName.equals(nextElement.getName)){
MyBean duplicate = new MyBean();
ArrayList values = new ArrayList<String>();
values.add(referenceElement.getValue);
values.add(nextElement.getValue);
collection.put("id= "+duplicate.setId(referenceElement.getId)+", "
+"name= "+duplicate.setName(referenceElement.getName), duplicate.setValue(values);
}
}
}
同样,比较列表中bean对象的技巧是实现Comparable
接口。
答案 4 :(得分:0)
试试这个,
Map<String, ArrayList<String>> resultMap = new HashMap<String, ArrayList<String>>();
for (InputBean inputBean : inputBeanList)
{
String key = inputBean.getId() + "," + inputBean.getName();
if (resultMap.containsKey(key))
{
resultMap.get(key).add(inputBean.getValue());
}
else
{
ArrayList<String> resultList = new ArrayList<String>();
resultList.add(inputBean.getValue());
resultMap.put(key, resultList);
}
}
System.out.println("resultMap : " + resultMap);