-2

シナリオ: 1 日分の漁獲記録を含む ASCII テキスト ファイルが提供されました。ファイルの各行には、次の 3 つのフィールドを持つ「コロンで区切られた」キャッチ レコードが 1 つあります。

CONTESTANTS_NAME:FISH_TYPE:FISH_WEIGHT

例えば

PETER:TUNNY:13.3

これは PETER という競技者が 13.3 kg の TUNNY をキャッチしたことを示しています。ピーターは、その日に複数の魚を釣った可能性があることに注意してください。

Java の組み込みクラス Tokenizer と HashMap を使用して、この問題をどのように解決しますか?

設計では、次の分析が提供される必要があります。

  1. その日に釣れた魚種ごとの総重量。
  2. 各競技者が釣った魚の総重量。
  3. 総漁獲重量でランク付けされた上位 3 つの競合他社。

これを投稿する理由は、マップにはキーと値のペアだけが含まれていることを知ってパニックに陥り、3 つのフィールドがあるため、これを解決する方法がわからなかったからです。私がやったことは、2 つの HashMap を用意することです。最初の 1 つは CONTESTANT-NAME のキーを持ち、2 番目のキーは FISH_NAME で、必要な分析を提供できました。これには多くのループが必要で、それがプログラミングの良い方法であるかどうかはわかりません. 誰かがより良いアプローチを持っている場合は、私に知らせてください。ロジックが必要なだけです。

4

2 に答える 2

1

Guava Tableのようなテーブル クラスをチェックアウトすることもできます(2 次元マップと考えてください)。次に、CONTESTANT_NAME を最初のキーとして、FISH_NAME を 2 番目のキーとして、重みを保存値として使用できます。

Guava Table はまばらなテーブルでもうまくいくふりをしているので、試してみることを強くお勧めします。

于 2011-11-07T12:35:20.187 に答える
0

ハッシュマップで get/update/put コンボを実行できます

Double contestantTotal = contestantMap.get(contestant);
if(contestantTotal ==null)contestantTotal = Double.getValue(0);//if it wasn't already in the map the returned value will be null
contestantTotal += weight;
contestantMap.put(contestant,contestantTotal );//put overwrites the previous values

Double fishTypeTotal = fishTypeMap.get(fishType);
if(fishTypeTotal ==null)fishTypeTotal = Double.getValue(0);
fishTypeTotal += weight;
fishTypeMap.put(fishType,fishTypeTotal);

これには、入力ループと 2 つの出力ループの 3 つのループだけが必要です。

于 2011-11-06T22:03:21.340 に答える