返回与年份和排名相关联的字符串

时间:2017-05-11 15:52:49

标签: java hashmap set maps

所以基本上我有一张看起来像这样的地图

  dummy server test
got a new socket!
{ address: '127.0.0.1', family: 'IPv4', port: 6002 }
    ✓ should pass
got a new socket!
{ address: '127.0.0.1', family: 'IPv4', port: 6002 }
same socket? false
    ✓ should pass 2


  2 passing (71ms)

我希望返回粗体字符串,这是我到目前为止的方法

HashMap<Integer, HashMap<String, Integer>> girls = 
new HashMap<Integer, HashMap<**String**, Integer>>();'

我不确定如何进行上述标题

4 个答案:

答案 0 :(得分:2)

如果可以避免,请勿使用地图地图。你有可能想要的理由和情况,但是你已经看到了,这很令人困惑。

这不是您想要的情况之一。只需声明一个新类来封装此信息并将其存储在列表中:

class Girl
{
   // Declare getters if you want
   public final int    year;
   public final int    rank;
   public final String name;

   Girl(int year, int rank, String name){
       this.year = year;
       this.rank = rank;
       this.name = name;
   }
}

现在你的数据结构并不完整:

List<Girl> girls = new ArrayList<>();

你的功能非常简单:

public String getGirlName(int year, int rank) {
    for (Girl girl : girls) {
        if (girl.year == year && girl.rank == rank) {
            return girl.name;
        }
    }
    throw new RuntimeException("No such girl"); // or whatever
}

答案 1 :(得分:2)

让我们尝试直观地看到HashMap<Integer, HashMap<String, Integer>>的结构,因为它是一个非常复杂的数据结构

//             A         B
//         |--------|--------|
//      C                              D
//  |------|---------------------------------------------------------------------|
{
    Integer: {String: Integer, String: Integer, String: Integer, String: Integer},
    Integer: {String: Integer, String: Integer, String: Integer, String: Integer},
    Integer: {String: Integer, String: Integer, String: Integer, String: Integer},
    Integer: {String: Integer, String: Integer, String: Integer, String: Integer}
}

A和C部分是键,B和D是值。

现在让我们看看.get(year).get(rank);是什么。首先,调用get(year)year是C部分中的值,因此get(year)会在D部分返回一个值。接下来,调用get(rank)。由于在get(year)的返回值上调用它,rank这里是A部分中的值。get(rank)将在D部分返回一个值,它们都是Integer个。因此,发生编译器错误。

要解决此问题,只需在内部地图中交换两种类型即可。您从HashMap<Integer, HashMap<String, Integer>>更改为HashMap<Integer, HashMap<Integer, String>>

答案 2 :(得分:1)

如上所述,您的代码编译不会超出您提到的原因。

我认为你误解了如何使用Map。地图用作书中的词汇表。词汇表包含主题的页码。在类似的意义上,Map包含给定(k [页码])的值(v [value])。

但是你可以告诉电脑你想要存储什么。因此,您需要了解您的键和值,以便正确构建地图。

答案 3 :(得分:-1)

您可以流式传输地图:

//get the map that match the year:
Map<String, Integer> mapForKeyYear = g.getOrDefault(year, null);

//if the map is not null then filter that map to the rank:

String r = mapForKeyYear
        .entrySet().stream()
        .filter(e -> e.getValue() == rank)
        .map(Map.Entry::getKey)
        .findFirst().orElse(null);