2017-06-21 3 views
1

私はHashMapsについて学習しようとしていて、値の削除(この場合は場所)の助けを得ることを望んでいました。私は3つのHashMaps(perName、perCategory、perPosition)を持ち、そのうちの2つは値として場所のリストを持ち、すべてがキーとして文字列/位置を持っています。したがって、同じ名前またはカテゴリの異なる場所が存在する可能性があります。私はその場所が "マーク"されているかどうかに基づいて、各HashMapの値リストから特定の場所を削除したいと思います。Javaの値のリストでHashMapから値を削除するにはどうすればよいですか?

すべての追加された場所はすべてのHashMapsに格納され、マークされた場所は別のArrayListに格納されます。私は、ArrayListをループし、各HashMapから各場所/値を削除しようとしています。同じキーを持つ他のマークのない場所がある可能性があるので、キーを削除したくありません。これは可能ですか?現時点では、私はそれらを削除しようとすると消えるように見えません。

私は別の方法を試しましたが、反復子(不要かもしれない)がキー全体を削除するようですが、forループを持つものは何も削除しません。私がこれを解決するのに十分な情報を提供していないかどうか教えてください。ありがとうございました。

private Map<Position, Place> perPosition = new HashMap<>(); 
    private Map<String, List<Place>> perCategory = new HashMap<>(); 
    private Map<String, List<Place>> perName = new HashMap<>() 

    //method 1 
    Iterator<Place> it = markedPlace.iterator(); 
       while (it.hasNext()) { 

       Place p = it.next(); 
       perPosition.remove(p.getPosition()); 
       perName.remove(p.getName()); 
       perCategory.remove(p.getCategory()); 
       p.setMarked(false); 
       p.setVisible(false); 
       it.remove(); 
      } 

    //method 2 
       for (Place p : markedPlace) { 
        for (Map.Entry<String, List<Place>> entry : perName.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perName.remove(entry.getValue()); 
         } 
        } 

        for (Map.Entry<String, List<Place>> entry : perCategory.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perCategory.remove(entry.getValue()); 
         } 
        } 

        for (Map.Entry<Position, Place> entry : perPosition.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perName.remove(entry.getKey()); 
         } 

         } 
        markedPlace.clear(); 

答えて

2

entry.getValue()はタイプList<Place>であり、pはタイプPlaceあります。したがって、perNameおよびperCategoryループの場合、equalsは決してtrueになりません。代わりに.contains(foo)を使用して、オブジェクトがリストに含まれているかどうかを確認する必要があります。

次に、保持したいリストをパージしようとしています。マップではなく、リストからエントリを削除したいとします。

if (entry.getValue().contains(p)) { 
    entry.getValue().remove(p); 
} 

そして、あなたは、単に

for (Map.Entry<String, List<Place>> entry : perName.entrySet()) { 
    entry.getValue().remove(markedPlace); 
} 

を行うことができますので、そのリストはまた、場所のクラスには、必ずイコールとハッシュコードをオーバーライドする作る、remove collectionをサポートしていますか、あるいは両方の場所は、オブジェクト場合にのみマッチしますインスタンス化されたオブジェクトはまったく同じです。

関連する問題