2015-01-08 3 views
2

Я использую java 1.6. У меня есть итератор на ArrayList. Для каждого Java-компонента он возвращает значения в нижнем формате.Преобразовать список в HasMap String & ArrayList

id="my_Bean" name="my Bean" value="Red" 

Для каждой итерации возможно, что я буду получать один и тот же идентификатор & имя с различными «значение».

Я хочу преобразовать его в HashMap (возможно), который должен дать мне значения в нижнем формате.

collection= { {id= "my_Bean", name= "my Bean", values= ["Red", "Blue", "Green"]}, .....& so on.. } 

Я не могу написать логику для этого. Любая помощь будет отличной.

+0

вы имеете в виду у вас есть составные ключи с идентификатором и именем и списком значений? – SMA

+0

@almasshaikh Возможно Да, я не уверен в этом – ScrapCode

+0

Для данного идентификатора имя всегда будет одинаковым? – Krease

ответ

0

Вы можете сделать ключи для вашей карты таким образом

String key = id + "-" + name; 
+0

Если вы хотите иметь карту String и Array fro например Map map = new HashMap (); – mehdinf

0

Если предположить, что ваш боб имеет добытчик следующий подход может оказаться полезным. Используется составной ключ, а значение Map - это List<Bean> (вместо этого это может быть, например, List<String> с, если это необходимо).

Итак, я бы использовал цикл и собирал все значения, а затем использовал составной ключ. Один путь состоит в использовании 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 +» - «+ name».

Также обратите внимание, что существует множество библиотек, которые предлагают Pair -классы или аналогичные. Иногда класс можно назвать Tuple.

0

Может быть, это одно решение:

Я предполагаю, что у вас есть геттеры/сеттеры на ваших полях объектов.

Сделать поле значение вашего боба также 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); 
                  } 
           } 
} 

также наконечник для сравнения боб объекты вашего списка реализовать Comparable интерфейс.

1

Вы можете использовать составной ключ в HashMap <>, чтобы добавить свой объект bean. Я добавил values в ваш bean-компонент, который является списком value для того же компонента, чей идентификатор и имя одинаковы.

Ниже приведен код:

 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 к HashMap, если он отсутствует с ключом (комбинация id-name) с добавлением нового списка значений с текущим значением bean's value, если bean уже существует, чем принимать список значений и добавлять значение в этот список.

Надеюсь, это то, что вам нужно.

+1

upvote для использования containsKey, о котором я забыл. – drgPP

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); 
Смежные вопросы