我目前有一个解决方案,使用两个带有匹配键的HashMaps将值链接在一起(即密钥:前缀长度,值:子网掩码/可用地址数)。
这里是否存在重大的设计问题,并且使用元组值类型将这些HashMaps合并在一起会更好的做法,这会增加两个简单地图的复杂性吗? - 类似的问题给出了两种选择,但似乎没有给出何时使用一种方案的方案。
下面的示例实现:
private static HashMap<Integer, Integer> prefixAndNumberOfAddresses;
private static HashMap<Integer, String> prefixAndSubnets;
static {
prefixAndNumberOfAddresses = new HashMap<Integer, Integer>();
prefixAndNumberOfAddresses.put(8, 16777214);
prefixAndNumberOfAddresses.put(9, 8388606);
prefixAndNumberOfAddresses.put(10, 4194302);
prefixAndNumberOfAddresses.put(11, 2097150);
prefixAndNumberOfAddresses.put(12, 1048574);
prefixAndNumberOfAddresses.put(13, 524286);
prefixAndNumberOfAddresses.put(14, 262142);
prefixAndNumberOfAddresses.put(15, 131070);
prefixAndNumberOfAddresses.put(16, 65534);
prefixAndNumberOfAddresses.put(17, 32766);
prefixAndNumberOfAddresses.put(18, 16382);
prefixAndNumberOfAddresses.put(19, 8190);
prefixAndNumberOfAddresses.put(20, 4094);
prefixAndNumberOfAddresses.put(21, 2046);
prefixAndNumberOfAddresses.put(22, 1022);
prefixAndNumberOfAddresses.put(23, 510);
prefixAndNumberOfAddresses.put(24, 254);
prefixAndNumberOfAddresses.put(25, 126);
prefixAndNumberOfAddresses.put(26, 62);
prefixAndNumberOfAddresses.put(27, 30);
prefixAndNumberOfAddresses.put(28, 14);
prefixAndNumberOfAddresses.put(29, 6);
prefixAndNumberOfAddresses.put(30, 2);
}
static {
prefixAndSubnets = new HashMap<Integer, String>();
prefixAndSubnets.put(8, "255.0.0.0");
prefixAndSubnets.put(9, "255.128.0.0");
prefixAndSubnets.put(10, "255.192.0.0");
prefixAndSubnets.put(11, "255.224.0.0");
prefixAndSubnets.put(12, "255.240.0.0");
prefixAndSubnets.put(13, "255.248.0.0");
prefixAndSubnets.put(14, "255.252.0.0");
prefixAndSubnets.put(15, "255.254.0.0");
prefixAndSubnets.put(16, "255.255.0.0");
prefixAndSubnets.put(17, "255.255.128.0");
prefixAndSubnets.put(18, "255.255.192.0");
prefixAndSubnets.put(19, "255.255.224.0");
prefixAndSubnets.put(20, "255.255.240.0");
prefixAndSubnets.put(21, "255.255.248.0");
prefixAndSubnets.put(22, "255.255.252.0");
prefixAndSubnets.put(23, "255.255.254.0");
prefixAndSubnets.put(24, "255.255.255.0");
prefixAndSubnets.put(25, "255.255.255.128");
prefixAndSubnets.put(26, "255.255.255.192");
prefixAndSubnets.put(27, "255.255.255.224");
prefixAndSubnets.put(28, "255.255.255.240");
prefixAndSubnets.put(29, "255.255.255.248");
prefixAndSubnets.put(30, "255.255.255.252");
}
答案 0 :(得分:1)
在这种情况下,您最好使用一个HashMap
,其值为Tuple
。
如果你使用两个HashMap
:
HashMap
HashMap
具有相同的大小答案 1 :(得分:1)
两个单独的HashMap
非常麻烦且容易出错。将两者合并为一个HashMap
,并保存一个查找和一些代码行。
正如我在评论中所述,如果您需要非常频繁地访问该查找表(每秒一次,或每秒100次),那么使用表查找可能会更好。否则,你可以采用程序化方法。它确实有点慢,但它肯定更优雅,更面向对象。
public class SubnetMask {
private int prefix;
public SubnetMask(int prefix) {
if (prefix < 8 || prefix > 30) {
throw new IllegalArgumentException("Prefix must be in [8;32]");
}
this.prefix = prefix;
}
public long getNrOfAvailableAddresses() {
return (long) Math.pow(2, 32 - this.prefix) - 2;
}
// returns something like "255.255.192.0"
public String getSubnetMaskRepresentation() {
long bits = 0xffffffff ^ (1 << 32 - this.prefix) - 1;
return String.format("%d.%d.%d.%d",
(bits & 0x0000000000ff000000L) >> 24,
(bits & 0x0000000000ff0000) >> 16,
(bits & 0x0000000000ff00) >> 8, bits & 0xff);
}
}
PS。:从 gma的回答in another post转换为x.x.x.x表示。
PPS。:Intellij Idea建议简化long bits = ...
声明。不要这样做,似乎给出了错误的结果。