2016-10-24 4 views
1

У меня есть один ArrayList, заполненный прямоугольниками. Я хочу добавить содержимое на карту, где Key будет координатой X, а значение - List, которое имеет такой же 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); 
     } 
    }); 
} 

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

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

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

Как это сделать?

ответ

3

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

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

Давайте посмотрим на код:

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

Ваш булево: отлично работает; ваша проблема: вызов List.add() возвращает boolean значение. А ваша Карта просто не Принимаю boolean values!

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

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

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

+0

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

+0

Добро пожаловать. – GhostCat

Смежные вопросы