向Map添加值时不兼容的类型

时间:2016-10-24 11:07:10

标签: java dictionary arraylist

我有一个ArrayList填充了Rectangles。我想将内容添加到Map,其中Key将是X坐标,值是具有相同X cord的List。

我可以通过功能

来做到这一点
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));
    });
}

当我这样做时,我得到错误,因为布尔值不能转换为List。 当我向地图中的ArrayList添加新的Rectangle或创建新的ArrayList时,它返回boolean而不是我希望它返回ArrayList。

我该怎么做??

2 个答案:

答案 0 :(得分:4)

让我们看看你的代码:

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

你的布尔值?:工作正常;您的问题是:调用List.add()会返回布尔值值。而你的地图根本就不是接受布尔值!

避免该问题的一个选择:使用一些临时列表对象来处理:

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

无论如何,我会推荐这样的风格。有时人们认为将尽可能多的陈述推到一条线上是“好事”;但问题是:代码应该写成可读。我实际上认为我的建议也比你最初的输入更容易消化。

答案 1 :(得分:3)

我建议您使用groupingBy

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