2016-10-24 57 views
1

我有一個ArrayList填充了矩形。我想將內容添加到Map中,其中Key將是X座標,值是具有相同X線的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)); 
    }); 
} 

當我這樣做,我得到錯誤,因爲布爾值不能轉換爲列表。 當我添加新的Rectangle到地圖中的ArrayList或創建新的ArrayList時,它返回布爾值而不是我希望它返回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()返回一個布爾值值。而你的地圖根本就不是接受布爾值!

一個選項來避免這個問題:用一些臨時列表對象上下工夫:

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