3

ArrayList を値として使用する HashMap を使用しています。

このような:

Map<Movie, List<Grades>> gradedMovies = new HashMap();

キー(映画)がすでに存在するかどうかを確認するために値を反復処理できるメソッドを作成しようとしています。もしそうなら、特定のキー(映画)に割り当てられたリストに新しい値(グレード)を追加したいと思います。このようなもの:

public void addGrade(Movie movie, Grade grade) {
// stuff here }

最終的に、マップに追加された後に映画とそのグレードを表示するマップを印刷できるようにしたくありません。

これはどのように達成されますか?または、(マップを使用した)私のアプローチ全体が完全に間違っていますか?

ご協力ありがとうございます。(これは宿題です)

4

8 に答える 8

4

私はあなたが正しい道を進んでいると思います.movi​​eオブジェクトが実装されていることを確認してくださいequals.hashCodeハッシュマップの真のキーとして機能します.

きれいに印刷したい場合は、toString メソッドを実装するだけです。

public void addGrade(Movie movie, Grade grade) {
    if (!gradedMovies.containsKey(movie)) { 
        gradedMovies.put(movie, new ArrayList()); 
    }
    gradedMovies.get(movie).add(grade);
}

これが役に立てば幸いです、乾杯!

于 2012-04-25T15:01:03.943 に答える
3

次のようなものを使用できます。

public void addGrade(Movie movie, Grade grade) {
    if (!gradedMovies.containsKey(movie)) {
        gradedMovies.put(movie, new ArrayList<Grade>());
    }
    gradedMovies.get(movie).add(grade);
}

メソッドをオーバーライドする必要がありますequals

于 2012-04-25T15:01:46.153 に答える
3

特にインデックスを探している理由がわかりません-aのポイントは、Mapキーでエントリを検索できることです。

出発点として、addGradeメソッドの最初の行は次のようになります

List<grades> grades = gradedMovies.get(movie);

うまくいけば、そこから取得できます。(マップに特定のムービーがまだ含まれていない場合にどうなるかについては、ドキュメントを参照することを忘れないでください...)

于 2012-04-25T15:02:03.533 に答える
2

Guava のMultimapを確認してください。それはまさにそれがすることです。

private Multimap<Movie, Grade> map = ArrayListMultimap.create();

public void addGrade(Movie movie, Grade grade){
   map.put(movie, grade);
}

それはあなたのためにリストを作成します。

于 2012-04-25T15:30:56.047 に答える
2

値を反復処理して、キー (映画) が既に存在するかどうかを確認できます

マップを反復処理する必要はありません。 を呼び出すだけgradedMovies.containsKey( movieToCheck )です。

をキーとして使用する場合は、とMovieの適切な実装を提供する必要があることに注意してください。equals()hashCode()

于 2012-04-25T15:03:15.670 に答える
2

あなたは大丈夫です!ただし、いくつかのことを考慮する必要があります。

マップ上で値を見つける際、Movie オブジェクトはequalsと hashChode をオーバーライドする必要があります。Java は、主に自動比較 (リストにアイテムが含まれているかどうか、この場合はキー値が指定された値と等しいかどうかの検証など) に関しては、比較で常に equals メソッドを使用します。equals はアイテムの一意性を定義するため、識別番号や (この場合は) 名前など、特定の一意の属性に基づいて比較を行う必要があります。

マップを印刷するには、手動で (強化された "for" ループ)、または反復子 ( .iterator ()メソッドを介して直接取得できます) を使用して、keySet を反復処理します。映画ごとに、同様の方法で成績リストを出力します。

String の印刷に慣れているかどうかはわかりませんが、文字の特別な組み合わせを String に追加して、ある種の書式設定を行うことができます。例えば:

  • \n 改行を挿入します
  • \t は表です

これがいくつかの疑問を解消するのに役立つことを願っています. 幸運を!。

于 2012-04-25T15:07:18.057 に答える
1
public void addGrade(Movie movie, Grade grade) {

boolean found = false;
for(Movie m : gradedMovies.keyset()) {
    // compare the movies
    if(/* match on movies */) {
        gradedMovies.get(m).add(grade);
        found = true;
    }
}
if(!found) {
    gradedMovies.put(movie, new ArrayList().add(grade));
}
}
于 2012-04-25T15:02:14.220 に答える
1
gradedMovies.containsKey(movie);

    for(Map.Entry<Movie,List<Grades>> entry : gradedMovies.entrySet()){
            Movie key = entry.getKey();
       }
于 2012-04-25T15:02:25.733 に答える