所以基本上我有一张看起来像这样的地图
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>>();'
我不确定如何进行上述标题
答案 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);