-2

场景:您收到了一个包含一天捕获记录的 ascii 文本文件。文件中的每一行都包含一个“冒号分隔”的捕获记录,其中包含三个字段:

CONTESTANTS_NAME:FISH_TYPE:FISH_WEIGHT

例如

PETER:TUNNY:13.3

这表明一位名叫 PETER 的参赛者抓到了一只重 13.3 公斤的 TUNNY。请注意,彼得当天可能钓到了不止一条鱼。

你将如何使用 java 的内置类 Tokenizer 和 HashMap 来解决这个问题?

您的设计应提供以下分析:

  1. 当天捕获的每种鱼的总重量。
  2. 每个参赛者捕获的鱼的总重量。
  3. 按总捕获重量排名的前三名参赛者。

我发布这个的原因是乍一看我有点惊慌,因为我知道任何映射都只包含一个键值对并且不知道如何解决这个问题,因为它有三个字段。我所做的是有两个 HashMap,第一个具有 CONTESTANT-NAME 的键,第二个键是 FISH_NAME 并且能够提供所需的分析:这需要许多循环,我不确定这是否是一种好的编程方式. 如果有人有更好的方法,请告诉我。我只需要逻辑。

4

2 回答 2

1

您可能想查看表类,例如Guava Table(将其视为二维地图)。然后你可以使用 CONTESTANT_NAME 作为第一个键,FISH_NAME 作为第二个键,权重作为存储值。

Guava Table 甚至假装在稀疏表方面做得很好,所以我强烈建议你试一试。

于 2011-11-07T12:35:20.187 回答
0

你可以在 hashmap 上做一个 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);

这只需要 3 个循环,一个输入循环和 2 个输出循环

于 2011-11-06T22:03:21.340 回答