Как ГРУППИРОВАТЬ ПО одинаковым строкам в Java

#java

#java

Вопрос:

У меня есть Arraylist строк, и мне нужно вернуть одинаковые индексы Arraylist строк.

Например

 Arraylist[0]: IPAddress

Arraylist[1]: DomainName

Arraylist[2]: IPAddress

Arraylist[3]: Filesize
  

Вывод должен быть:

 Arraylist[0]
IPAddress|0,2 //0,2 denotes the arraylist index that is of the same

Arraylist[1]
DomainName|1

Arraylist[2]
Filesize|3
  

Есть идеи, как этого можно достичь?

Что я сделал, так это:

 for(int i=0; i<arr.size(); i  ){
   if(arr.get(i).equals(arr.size()-1)){
      //print index


   }
}
  

Комментарии:

1. Знаете ли вы, как использовать список вместо карты? HashMap<строка,список<строка>>.. Вы можете достичь, используя эту структуру данных

2. Вы искали информацию об алгоритмах сортировки и поиска?

3. Можете ли вы предоставить мне код для ссылки? Кажется, я не могу решить свою проблему после опробования моей логики…

4. Для меня это выглядит как дамп домашней работы. Но я согласен с @ShreyasSarvothama, за исключением того, что так и должно быть Map<String, List<Integer>> .

5. Отсутствие опыта не является оправданием для того, чтобы не изучать что-то новое.

Ответ №1:

С потоками Java8

     List<String> strings = Arrays.asList("IPAddress", "DomainName", "IPAddress", "Filesize");
    Map<String, List<Integer>> map = IntStream.range(0, strings.size()).boxed().collect(Collectors.groupingBy(strings::get));
    System.out.println(map);
  

вывод

 {DomainName=[1], Filesize=[3], IPAddress=[0, 2]}
  

Чтобы получить результаты в упорядоченном

     Map<String, List<Integer>> map = IntStream.range(0, strings.size())
                                    .boxed()
                                    .collect(Collectors.groupingBy(strings::get, LinkedHashMap::new, Collectors.toList()));
  

Ответ №2:

Механические шаги довольно просты:

  • Получите коллекцию, которая может поддерживать ключ (который является строкой в вашем списке) и список значений, представляющих индексы, в которых они встречаются (что было бы другим ArrayList ).
  • Если элемент существует в коллекции, просто добавьте индекс к его значению.
  • В противном случае создайте новый список, добавьте к нему индекс, а затем добавьте его в коллекцию.

Вот несколько примеров кода ниже.

 final List<String> list = new ArrayList<String>() {{
    add("IPAddress");
    add("DomainName");
    add("IPAddress");
    add("Filesize");
}};

final Map<String, List<Integer>> correlations = new LinkedHashMap<>();
for (int i = 0; i < list.size(); i  ) {
    final String key = list.get(i);
    if (correlations.containsKey(key)) {
        correlations.get(key).add(i);
    } else {
        final List<Integer> indexList = new ArrayList<>();
        indexList.add(i);
        correlations.put(key, indexList);
    }
}
  

Любые оптимизации к вышесказанному оставлены в качестве упражнения для читателя.

Комментарии:

1. new ArrayList<>(Arrays.asList("IPAddress", "DomainName", "IPAddress", "Filesize")) было бы лучше, чем создавать целый новый анонимный класс только для заполнения списка.

2. @Andreas: Возможно, но я собираюсь предположить, что начальная информация поступает откуда-то еще. Это было только там в качестве примера; это не является фокусом решения.

3. Для этого все 8-строчное содержимое цикла может быть таким простым: correlations.computeIfAbsent(list.get(i), k -> new ArrayList<>()).add(i)