迭代包含固定列表作为键的映射

时间:2014-05-12 14:24:47

标签: java list map

我有一个对象&#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)。

现在我被困在这里,可能解决方案非常简单,但我现在无法找到它......

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);
}