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中完成了。。