Ошибка несовместимых типов при указании ArrayList в качестве значения для карты - PullRequest
1 голос
/ 28 марта 2020

Я получаю список, если он уже существует, и добавляю в него элемент.

Фрагмент кода:

Map<Integer, List<Integer>> map = new TreeMap<>(Collections.reverseOrder());
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
    int factor = 0;
    int num = sc.nextInt();
    for (int j = 1; j <= num; j++)
      if (num % j == 0) factor++;  //just getting factor count of each input

    map.put(factor, map.getOrDefault(factor, new ArrayList<>()).add(num)); // error line

Сведения об ошибке:

ошибка: несовместимые типы: логическое значение не может быть преобразовано в список

Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Поскольку add () имеет boolean в качестве типа возврата. Вы не можете поместить логическое значение на карту, значение которой List<Integer>.

Вам необходимо создать ArrayList -> сначала добавить элемент к нему.

И только затем поместите его на карту в качестве значения:

List<Integer> list = new ArrayList<>();
list.add(num);
map.put(factor, map.getOrDefault(factor, list));

Начиная с Java 9+, вы можете использовать List.of():

map.put(factor, map.getOrDefault(factor, List.of(num)));
0 голосов
/ 28 марта 2020

В строке ошибки создается новый ArrayList <> (), даже если предыдущий ArrayList используется повторно, поэтому попробуйте:

List<Integer> list = map.get(factor);
if (list == null) {
   list = new ArrayList<>();
   map.put(factor, list);
}
list.add(num);

In java 9 List.of (num) является неизменным, поэтому. добавить (num) к существующему не удастся, но в Java 8+ вы можете использовать это более краткое определение, которое создает новый ArrayList только при необходимости:

var map = new TreeMap<Integer, List<Integer>>(Collections.reverseOrder());
...
map.computeIfAbsent(factor, ArrayList::new).add(num);
...