我有一个对象&#34; Node&#34;由hostName和字符串列表定义(包含节点提供的一个或多个服务的列表)。我需要编写一个迭代Map <List<String>, Integer>
的方法,当客户端询问某个服务是否可用时,它会返回提供所请求服务的所有节点。
我有一个类似的方法适用于包含单个字符串(不是字符串列表)的Node对象:
public Map<String, Integer> getProvidersForService(String svcName, int port) throws TException {
Map<String, Integer> result = new HashMap<>();
for (Map.Entry<Node, Integer> pair : nodePorts.entrySet()) {
String nodeService = pair.getKey().services;
if (nodeService.equals(svcName)) {
result.put(pair.getKey().services, pair.getValue());
break;
}
}
return result;
}
现在我需要将此方法适用于具有固定字符串列表的新对象Node。每个对象节点都有一个固定的字符串列表。我不知道该怎么办,你能帮助我吗?
编辑:这是我尝试使用的代码,但它有一些问题。 &#34; NodeMultiService&#34;是一个类似于&#34; Node&#34;的对象。具有hostName和List(而不是简单的String)作为参数。这是代码:
public Map<List<String>, Integer> getProvidersForMultiService(List<String> svcNames, int port) throws TException {
svcNames = new ArrayList<String>();
Map<List<String>, Integer> result = new HashMap<>();
for (Map.Entry<NodeMultiService, Integer> pair : nodeMultiAndPorts.entrySet()) {
List<String> nodeServices = pair.getKey().services;
if (nodeServices.equals(svcNames)) {
result.put(pair.getKey().services, pair.getValue());
break;
}
}
return result;
}
这里有一些错误,因为它似乎无所事事。我有一个&#34; registerNodeMulti&#34;返回int的方法(即节点用于在服务器上注册的端口),并将其服务(List)添加到映射中。所以我调用这个方法将一个Node添加到地图中,然后我调用getProviderForMultiService方法来查看哪个节点有一个ask服务。
第一个简单的测试是添加一个NodeMultiService,因此映射应该有一个键/值,但这不会发生(我检查使用断言并且测试没有通过检查的断言如果地图大小为1)。
现在我被困在这里,可能解决方案非常简单,但我现在无法找到它......
答案 0 :(得分:0)
您需要Map<String, List<X> >
。其中X
是指向端点的指针,该端点提供名称是映射中的键的服务。在您的情况下X
=== Integer
,一个端口。
所以:
Map<String, List<X> > endpoints; // {{"http", [80,8080]}, {"https", [443,8443]}, ...}
List<X> getProvidersForService<X>(String name) {
return endpoints.get(name);
}