将List转换为String&的HashMap数组列表

时间:2015-01-08 06:38:07

标签: java arraylist collections

我使用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.. }

我无法为它编写逻辑。任何帮助都会很棒。

5 个答案:

答案 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);