Java конвертирует {String, String} [] в Map <String, String []> - PullRequest
3 голосов
/ 24 июня 2010

Учитывая класс:

 public class CategoryValuePair
 {
      String category;
      String value;
 }

И метод:

public Map<String,List<String>> convert(CategoryValuePair[] values);

Учитывая, что в values мы можем получить много записей с той же категорией, я хочу преобразовать этив Map, сгруппированных по категориям.

Существует ли быстрый / эффективный способ выполнить это преобразование?

Ответы [ 4 ]

2 голосов
/ 24 июня 2010

Насколько я знаю, нет более простого способа, чем итерировать значения, а затем поместить значения в карту (как в каком-то предопределенном методе).

Map<String, List<String>> map = new HashMap<String, List<String>>();
if (values != null) {
    for (CategoryValuePair cvp : values) {
      List<String> vals = map.get(cvp.category);
      if (vals == null) {
        vals = new ArrayList<String>();
        map.put(cvp.category, vals);
      }
      vals.add(cvp.value);
    }
}

Я изменил значения карты с String[] до List<String>, так как мне кажется, что использовать его проще, чтобы вам не пришлось беспокоиться о изменении размера массива.

1 голос
/ 25 июня 2010

С lambdaj вам потребуется всего одна строка кода для достижения этого результата следующим образом:

group(values, by(on(CategoryValuePair.class).getCategory()));
1 голос
/ 24 июня 2010

Чтобы сделать это в меньшем количестве строк кода, используйте Google Collections :

public Map<String, Collection<String>> convert(CategoryValuePair[] values) {
    Multimap<String, String> mmap = ArrayListMultimap.create();
    for (CategoryValuePair value : values) {
        mmap.put(value.category, value.value);
    }
    return mmap.asMap();
}

Если вы не хотите разрешать повторяющиеся значения, замените ArrayListMultimap на HashMultimap.

0 голосов
/ 24 июня 2010

Просто для реализации ... Метод возвращает Map, а также проверяет наличие дубликатов в массивах ... хотя производительность и высока ...

public Map<String,String[]> convert(CategoryValuePair[] values)
{
    Map<String, String[]> map = new HashMap<String, String[]>();
    for (int i = 0; i < values.length; i++) {
        if(map.containsKey(values[i].category)){
            Set<String> set = new HashSet<String>(Arrays.asList(map.get(values[i].category)));
            set.add(values[i].value);
            map.put(values[i].category, set.toArray(new String[set.size()]));
        }else {
            map.put(values[i].category, new String[]{values[i].value});
        }
    }

    return map;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...