#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)