2016-10-24 5 views
1

私は1つのArrayListに長方形を塗りつぶしています。私はキーにX座標があり、値が同じXコードのListであるMapにコンテンツを追加したい。マップに値を追加しているときに、互換性のない型

は私が機能

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

を持っていることによって、これを行うことができますが、私は以下のようなものであれば-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を返す代わりにブール値が返されます。

どうすればいいですか?あなたのブール

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

:私はあなたがgroupingBy

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

答えて

3

は、あなたのコードを見てます?正常に動作します。あなたの問題は:List.add()を呼び出すブール値を返します。あなたのマップは単にを受理していませんブール値!その問題を回避するために

一つのオプション:上で動作するためにいくつかの一時的なリストオブジェクトを使用します。

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

私はとにかく、このようなスタイルをお勧めします。可能な限り多くのステートメントを1行にプッシュすることは "良い"と思うことがあります。しかし、事は:コードは可読なに書かれるべきです。私の提案は、あなたの最初の入力よりも消化しやすいと思っています。

関連する問題