java - 何时使用多个链接的 HashMap 与具有 Tuple 值类型的 HashMap

标签 java android hashmap

我目前有一个解决方案,它使用两个 HashMap 以及将值链接在一起的匹配键(即键:前缀长度,值:子网掩码/可用地址数)。

这里是否存在重大设计问题,使用 Tuple 值类型将这些 HashMap 合并在一起是否会更好,从而增加两个简单映射的复杂性? - 类似的问题提供了两种选择,但似乎没有给出何时使用其中一种的场景。

下面的实现示例:

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");
}

最佳答案

两个单独的 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.: x.x.x.x 表示的翻译取自 gma 的 答案 in another post .

PPS.: Intellij Idea 建议简化 long bits = ... 语句。不要这样做,它似乎给出了错误的结果。

关于java - 何时使用多个链接的 HashMap 与具有 Tuple 值类型的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50436585/

相关文章:

java - 请建议java邮件api

android - 解析 XML 时出错 : unbound prefix in custom view

android - 在生成的 iText PDF 文档中居中对齐图像

java - 找出 HashMap 中使用的类型

java - 从 Java 中的 Map 中选择随机键和值集

java - 如何使用 JFreeChart 叠加拟合分布和直方图?

java - 双向链表插入前端方法

java - 销毁 ViewPager

android - 我可以在列表单击时关闭警报对话框吗?

dictionary - 为什么count++(而不是count = count + 1)改变了Golang中map的返回方式