给定数据中心列表dc1
,dc2
,dc3
和计算机列表h1
,h2
,h3
,{{ 1}}如下所述 -
h4
我想仅针对以上列表生成以下组合 -
Datacenters = dc1, dc2, dc3
Machines = h1, h2, h3, h4
通常,每次传递中的每个数据中心都应该获得备用计算机/主机。他们不应该得到相同的机器。例如,如上所示在a) {dc1=h1, dc3=h3, dc2=h2}
b) {dc1=h2, dc3=h4, dc2=h3}
c) {dc1=h3, dc3=h1, dc2=h4}
d) {dc1=h4, dc3=h2, dc2=h1}
- a
,dc1 gets h1
,dc2 gets h2
,因此每个数据中心的所有计算机都不同。在第二遍中,如dc3 gets h3
- 现在b
所示(因为dc1在第一遍中已经获得了h1),dc1 gets h2
(bcoz dc2在第一遍中已经获得了h2),并且dc2 got h3
(bcoz dc3在第一遍中已经获得了h3)等等。
还有一个例子 - 如果我只有三个主机,那么下面的组合我应该只得到 -
dc3 got h4
所以我提出了以下代码,它完全正常,没有任何问题 -
Datacenters = dc1, dc2, dc3
Machines = h1, h2, h3
{dc1=h1, dc3=h3, dc2=h2}
{dc1=h2, dc3=h1, dc2=h3}
{dc1=h3, dc3=h2, dc2=h1}
以下是我的班级所做的所有工作 -
public class DataCenterMapping {
public static void main(String[] args) {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(Arrays.asList("dc1", "dc2", "dc3"), Arrays.asList(
"h1", "h2", "h3", "h4"));
// is there any way to precalculate number of combinations
// instead of using while loop here?
while (true) {
Map<String, String> coloHost = dcm.getDatacenterMachineMapping();
System.out.println(coloHost);
for (Map.Entry<String, String> entry : coloHost.entrySet()) {
}
}
}
}
问题陈述: -
唯一的问题是我有一个while循环,它会一直运行,这不是我想要的。我试图预先计算有效组合的数量,然后我可以使用for循环来迭代它。
有没有什么方法可以预先计算有效组合的数量,而不是在上面的代码中使用while循环?
答案 0 :(得分:1)
有效组合的数量=数据中心*机器;
答案 1 :(得分:0)
我假设有比数据中心更多的机器。在这种情况下,你的答案是:
hostList.size();
您始终可以生成以下集:
Set 1: (1,1), (2,2), ... (n,n)
Set 2: (1,2), (2,3), ... (n,n+1%m)
...
Set m: (1,m), (2,m+1 % m), ... (n,(n + m-1) % m)
请注意:
(m + 1) % m = 1
(n + m-1) % m = n-1
所以它确实是:
Set 1: (1,1), (2,2), ... (n,n)
Set 2: (1,2), (2,3), ... (n,n+1%m)
...
Set m: (1,m), (2,1), ... (n,n-1)
事实上......你的代码可以是:
public List<Map<String, String>> createMappings(List<String> datacenters, List<String> hosts) {
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
for(int i = 0; i < hosts.size(); i++) {
Map<String, String> row = new HashMap<String,String>();
for(int j = 0; j < datacenters.size(); j++) {
String datacenter = datacenters.get(j);
int hostIndex = (j + i) % hosts.size();
String host = hosts.get(hostIndex);
row.put(datacenter, host);
}
result.add(row);
}
return result;
}