Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Algorithm_Random_Map - Fatal编程技术网

Java 如何从地图中打印每个数据中心的随机主机?

Java 如何从地图中打印每个数据中心的随机主机?,java,algorithm,random,map,Java,Algorithm,Random,Map,我正在从事一个项目,其中我有数据中心和主机映射 下面是我的地图,其中包含数据中心和对应主机映射列表- private static Map<String, List<String>> datacenterHostsMapping = new LinkedHashMap<String, List<String>>(); 这里- phx、slc、lvs是数据中心 ho、h1、h2是该数据中心中的主机 数据中心中的主机数量始终相同且数量相等(此处为3

我正在从事一个项目,其中我有数据中心和主机映射

下面是我的地图,其中包含数据中心和对应主机映射列表-

private static Map<String, List<String>> datacenterHostsMapping = new LinkedHashMap<String, List<String>>();
这里-

  • phx、slc、lvs是数据中心
    
  • ho、h1、h2是该数据中心中的主机
    
  • 数据中心中的主机数量始终相同且数量相等(此处为3)
  • 在每个数据中心中,主机可以随机排列
  • 数据中心也可以是随机排列的
现在我有一个方法,我将在程序中的不同点调用它,它将以这样的方式使用上面的映射,对于每个数据中心,它应该给我一个随机主机,但没有主机应该与其他数据中心相同

private static void printRandomHost() {

    for(Map.Entry<String, List<String>> entry : datacenterHostsMapping.entrySet()) {
        // some code here?
    }
}
它可以为每个数据中心选择任意随机主机,假设它选择h0作为phx,h1作为slc,h2作为lvs。这里h0,h1,h2是不一样的,所以这很好。它不能在phx中打印
h0,在slc中打印h0,在lvs中打印h1,因为这里h0打印了两次,这不是我想要的

现在,如果我再次调用上述方法,这是第二次,那么它应该像这样打印出来(同样是每个数据中心中的随机主机,但这一次,它不会像第一次那样为phx打印h0,对于slc打印h1,对于lvs打印h2),所以它应该像这样打印出来-

{phx=[h0, h1, h2], slc=[h1, h0, h2], lvs=[h2, h0, h1]}
phx - h1
slc - h2
lvs - h0
phx - h2
slc - h0
lvs - h1
如果我第三次调用上述方法,那么它应该像这样打印出来-

{phx=[h0, h1, h2], slc=[h1, h0, h2], lvs=[h2, h0, h1]}
phx - h1
slc - h2
lvs - h0
phx - h2
slc - h0
lvs - h1
现在,它第四次不会打印任何内容,因为我们在上述三个过程中完成了每个数据中心的所有主机

我希望这个问题足够清楚。。现在,我不知道如何将此算法合并到我的上述方法中,这样,如果我是第一次调用,它应该通过确保不是主机相同来为每个数据中心选择随机主机


如果您对此有任何帮助,我们将不胜感激。

请尝试使用以下代码:

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Example {
private static Map<String, List<String>> datacenterHostsMapping = new LinkedHashMap<String, List<String>>();

public static void main(String[] args) {

    datacenterHostsMapping.put("phx", Arrays.asList("h0","h1","h2"));
    datacenterHostsMapping.put("slc", Arrays.asList("h1","h0","h2"));
    datacenterHostsMapping.put("lvs", Arrays.asList("h2","h0","h1"));

    //Execute 5 times to print  data center and host information
    for(int i=1;i <=5;i++)
    {
        System.out.printf("Loop - %d \n", i);
        int index = 0;
        String[] randomHosts = generateRandomHosts(datacenterHostsMapping.get("phx"));
        for(String key :datacenterHostsMapping.keySet())
        {
            System.out.printf("%s - %s \n", key, randomHosts[index++] );
        }
        System.out.println();
    }
}

   private static String[] generateRandomHosts(List<String> hostsList) {
    Collections.shuffle(hostsList);
    String[] randomHosts = new String[hostsList.size()];
    hostsList.toArray(randomHosts);
    return randomHosts;
}
}

请尝试使用以下代码:

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Example {
private static Map<String, List<String>> datacenterHostsMapping = new LinkedHashMap<String, List<String>>();

public static void main(String[] args) {

    datacenterHostsMapping.put("phx", Arrays.asList("h0","h1","h2"));
    datacenterHostsMapping.put("slc", Arrays.asList("h1","h0","h2"));
    datacenterHostsMapping.put("lvs", Arrays.asList("h2","h0","h1"));

    //Execute 5 times to print  data center and host information
    for(int i=1;i <=5;i++)
    {
        System.out.printf("Loop - %d \n", i);
        int index = 0;
        String[] randomHosts = generateRandomHosts(datacenterHostsMapping.get("phx"));
        for(String key :datacenterHostsMapping.keySet())
        {
            System.out.printf("%s - %s \n", key, randomHosts[index++] );
        }
        System.out.println();
    }
}

   private static String[] generateRandomHosts(List<String> hostsList) {
    Collections.shuffle(hostsList);
    String[] randomHosts = new String[hostsList.size()];
    hostsList.toArray(randomHosts);
    return randomHosts;
}
}

是否有一种方法可以对主机进行排序。如果是,那就简单了。。类似于phx[0]、slc[1]、lvs[2]的问题的某些部分没有意义。同一台主机(例如h0)如何在两个数据中心中可用?如果随机主机的顺序是随机的,为什么选择哪个位置显示随机主机很重要?第三,此API调用具有状态。这是对某种web服务的调用吗?你能为用例提供更多的上下文吗?@GV:是的,我们也可以对主机进行排序。因为它总是h0,h1,h2,h3,h4,hn。。所以我们可以从根本上解决…以下情况是违法的吗?phx-h1 slc-h1 lvs-h1@DeepakBala:我正在处理Zookeeper模式,因此每个数据中心目前有三台机器,但根据命名约定,我将所有数据中心的机器命名为h0、h1和h2。这是一个例子,主机可以是随机顺序的,也可以不是。。此方法将在rest服务中运行,并且此方法将仅为我们的一个用例调用,因此我知道我的rest服务中的哪些方法将调用它。是否有一种方法可以对主机进行排序。如果是,那就简单了。。类似于phx[0]、slc[1]、lvs[2]的问题的某些部分没有意义。同一台主机(例如h0)如何在两个数据中心中可用?如果随机主机的顺序是随机的,为什么选择哪个位置显示随机主机很重要?第三,此API调用具有状态。这是对某种web服务的调用吗?你能为用例提供更多的上下文吗?@GV:是的,我们也可以对主机进行排序。因为它总是h0,h1,h2,h3,h4,hn。。所以我们可以从根本上解决…以下情况是违法的吗?phx-h1 slc-h1 lvs-h1@DeepakBala:我正在处理Zookeeper模式,因此每个数据中心目前有三台机器,但根据命名约定,我将所有数据中心的机器命名为h0、h1和h2。这是一个例子,主机可以是随机顺序的,也可以不是。。此方法将在rest服务中运行,并且此方法将仅为我们的一个用例调用,因此我知道我的rest服务中的哪些方法将调用它..感谢您的建议和一个很好的示例,但这不是我实际寻找的。。如果你看到你的循环-3打印出来,phx的h1被重复了?正确的?phx的h1已经在循环-1中完成了,所以它不应该打印出该循环,与循环-5相同,因为phx的h2已经在循环-2中完成了..感谢您的建议和一个很好的示例,但这不是我在实际中寻找的。。如果你看到你的循环-3打印出来,phx的h1被重复了?正确的?phx的h1已经在循环-1中完成了,所以它不应该打印出该循环,而与循环-5相同,因为phx的h2已经在循环-2中完成了。。