Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在包含固定列表作为键的映射上迭代_Java_List_Map - Fatal编程技术网

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

Java 在包含固定列表作为键的映射上迭代,java,list,map,Java,List,Map,我有一个由其主机名定义的对象“节点”和一个字符串列表(由节点提供的一个或多个服务的列表组成)。我需要编写一个方法,在的映射上迭代,当客户机询问某个服务是否可用时,它将返回提供所请求服务的所有节点 我有一个类似的方法,适用于包含单个字符串(不是字符串列表)的节点对象: public Map getProvidersForService(字符串svcName,int-port)引发异常{ 映射结果=新的HashMap(); 对于(Map.Entry对:nodeport.entrySet()){ 字符

我有一个由其主机名定义的对象“节点”和一个字符串列表(由节点提供的一个或多个服务的列表组成)。我需要编写一个方法,在
的映射上迭代,当客户机询问某个服务是否可用时,它将返回提供所请求服务的所有节点

我有一个类似的方法,适用于包含单个字符串(不是字符串列表)的节点对象:

public Map getProvidersForService(字符串svcName,int-port)引发异常{
映射结果=新的HashMap();
对于(Map.Entry对:nodeport.entrySet()){
字符串nodeService=pair.getKey().services;
如果(nodeService.equals(svcName)){
put(pair.getKey().services,pair.getValue());
打破
}
}
返回结果;
}
现在我需要将此方法适应新的对象节点,该节点具有固定的字符串列表。每个对象节点都有一个固定的字符串列表。我不知道该怎么办,你能帮我吗

编辑:这是我尝试使用的代码,但它有一些问题。“NodeMultiService”是一个类似于“Node”的对象,它以主机名和列表(而不是简单的字符串)作为参数。代码如下:

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;
}
public Map getProvidersForMultiService(列出svcNames,int-port)抛出异常{
svcNames=newarraylist();
映射结果=新的HashMap();
对于(Map.Entry对:nodeMultiAndPorts.entrySet()){
List nodeServices=pair.getKey().services;
if(nodeServices.equals(svcNames)){
put(pair.getKey().services,pair.getValue());
打破
}
}
返回结果;
}
这里有点不对劲,因为它似乎什么都没做。我有一个“registerNodeMulti”方法,它返回int(即节点在服务器上注册时使用的端口),并将其服务(列表)添加到映射中。因此,我调用此方法向映射中添加一个节点,然后调用getProviderForMultiService方法查看哪个节点具有请求的服务

第一个简单的测试是添加一个NodeMultiService,因此映射应该有一个键/值,但这不会发生(我使用断言检查,测试不会通过检查映射大小是否为1的断言)

现在我被困在这里,可能解决方案很简单,但我现在找不到它…

您需要
Map
。其中
X
是指向提供服务的端点的指针,该服务的名称是映射中的键。在您的示例中,
X
==
Integer
,一个端口

因此:

映射端点;//{{“http”,[808080]},{“https”,[4438443]},…}
列表getProvidersForService(字符串名称){
返回endpoints.get(name);
}

为什么不使用一个映射,为每个服务包含提供此服务的节点列表作为键?我不明白地图是如何帮助你实现你想要的。一个以列表为键的地图?我认为,您需要重新考虑您的设计。该列表是固定的,因为每个注册到服务器的节点只有一个或多个服务,并且在注册后无法添加/删除任何内容(服务或其他内容)。。。我想要实现的是一个方法,当请求一个服务时,返回提供该服务的所有注册节点,但是一个节点当然可以有多个服务,所以我使用列表作为键。。。
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;
}
Map<String, List<X> > endpoints; // {{"http", [80,8080]}, {"https", [443,8443]}, ...}
List<X> getProvidersForService<X>(String name) {
    return endpoints.get(name);
}