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