несовместимый тип при добавлении значения к карте

#java #dictionary #arraylist

#java #словарь #arraylist

Вопрос:

У меня есть один ArrayList, заполненный прямоугольниками. Я хочу добавить содержимое на карту, где ключом будет координата X, а значением — список, который имеет тот же X-шнур.

Я могу сделать это, имея функцию

 void dummyFun(List<Rectangle> listRects)
{
    Map<Integer, List<Rectangle>> mapSameXCordRectangles = new HashMap<>();
    listRects.forEach((Rectangle table) ->
    {
        if(mapSameXCordRectangles.containsKey(table.x))
        {
            mapSameXCordRectangles.get(table.x).add(table);
        }
        else
        {
            List<Rectangle> lstRect = new ArrayList<>();
            lstRect.add(table);
            mapSameXCordRectangles.put(table.x, lstRect);
        }
    });
}
  

Но я хочу удалить оператор if-else чем-то вроде приведенного ниже.

 void dummyFun1(List<Rectangle> listRects)
{
    Map<Integer, List<Rectangle>> mapSameXCordRectangles = new HashMap<>();
    List<Rectangle> lstTemp = new ArrayList<>();
    listRects.forEach((Rectangle table) ->
    {
        mapSameXCordRectangles.put(table.x,mapSameXCordRectangles.containsKey(table.x) ? mapSameXCordRectangles.get(table.x).add(table): new ArrayList<>().add(table));
    });
}
  

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

Как я могу это сделать.?

Ответ №1:

Давайте взглянем на ваш код:

 mapSameXCordRectangles.put(
  table.x,
  mapSameXCordRectangles.containsKey(table.x) ?  
    mapSameXCordRectangles.get(table.x).add(table) : 
  new ArrayList<>().add(table));
  

Ваше логическое значение?: работает нормально; ваша проблема в том, что вызов List.add() возвращает логическое значение. И ваша карта просто не принимает логические значения!

Один из вариантов избежать этой проблемы: использовать некоторый временный объект list для работы:

 List<Rectangle> workingList =
  mapSameXCordRectangles.containsKey(table.x) ?  
    mapSameXCordRectangles.get(table.x) : 
    new ArrayList<>());
workingList.add(table);
mapSameXCordRectangles.put(
  table.x, workingList);
  

В любом случае я бы рекомендовал такой стиль. Иногда люди думают, что «здорово» поместить как можно больше инструкций в одну строку; но дело в том, что код должен быть написан так, чтобы его можно было читать. И я действительно думаю, что мое предложение здесь также легче переварить, чем ваш первоначальный ввод.

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

1. Спасибо за предложение.

Ответ №2:

Я предлагаю вам использовать groupingBy

 Map<Integer, List<Rectangle>> map = listRects.stream()
                                             .collect(Collectors.groupingBy(r -> r.x));