gpt4 book ai didi

java - 给定两个数组列表,如何计算有效组合数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:28:06 25 4
gpt4 key购买 nike

<分区>

给定数据中心列表 dc1dc2dc3 和机器列表 h1h2, h3, 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}

一般来说,每个 channel 中的每个数据中心都应该有备用机器/主机。他们不应该得到相同的机器。例如在 a 中,如上所示 - dc1 获取 h1dc2 获取 h2dc3 获取 h3 所以所有每个数据中心的机器都不同。在第二遍中,如 b 所示 - 现在 dc1 得到 h2(因为 dc1 在第一遍中已经得到 h1),dc2 得到 h3 (bcoz dc2 已经在第一遍中得到了 h2),并且 dc3 得到了 h4(bcoz dc3 已经在第一遍中得到了 h3)等等。

还有一个例子——如果我只有三个主机,那么下面的组合我应该只得到——

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()) {

}
}
}
}

下面是我的类(class),它完成了所有的工作-

class DatacenterMachineMapping {

private boolean firstCall = true;
private int hostListIndex = 0;
private List<String> datacenterList, hostList;
private Map<String, Set<String>> dataCenterHostsMap = new HashMap<String, Set<String>>();

public DatacenterMachineMapping(List<String> datacenterList, List<String> hostList) {
this.datacenterList = datacenterList;
this.hostList = hostList;
}

public Map<String, String> getDatacenterMachineMapping() {
Map<String, String> datacenterMachineMapping = new HashMap<String, String>();
if (!firstCall) {
if (hostListIndex <= 0) {
hostListIndex = hostList.size();
}
hostListIndex--;
} else {
firstCall = false;
}
for (String datacenter : datacenterList) {
if (hostListIndex == hostList.size()) {
hostListIndex = 0;
}
if (addDataCenterHost(datacenter, hostList.get(hostListIndex))) {
datacenterMachineMapping.put(datacenter, hostList.get(hostListIndex++));
}
}
hostListIndex--;
return datacenterMachineMapping;
}

private boolean addDataCenterHost(String datacenter, String host) {
Set<String> dataCenterHostSet = dataCenterHostsMap.get(datacenter);
if (dataCenterHostSet == null) {
dataCenterHostSet = new HashSet<String>();
dataCenterHostsMap.put(datacenter, dataCenterHostSet);
}
return dataCenterHostSet.add(host);
}
}

问题陈述:-

唯一的问题是我有一个 while 循环,它会一直运行,这不是我想要的。我正在尝试预先计算有效组合的数量,然后我可以使用 for 循环对其进行迭代。

有什么方法可以预先计算有效组合的数量,而不是在上面的代码中使用 while 循环?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com