我有一个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。
我该怎么做??
答案 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));