HashSet不能以同样的方式存储相等的整数和双数值。

问题描述 投票:0回答:1

所以,我还是个用Java编码的新手,在尝试了ProjectEuler的 第29题我试着使用HashSets的蛮力解决,但如果HashSet被设置为存储Integer和Double值,即使它们总是相同的值,存储在HashSet中的值也是不同的。

ProjectEuler问题29:2≤a≤100,2≤b≤100,ab生成的序列中有多少个不同项?

请看下文。

    // Java
    private static int distinctAb(int start, int last) {
        HashSet<Double> products = new HashSet<>();
        for (int a = start; a <= last; a++) {
            for (int b = start; b <= last; b++) {
                double result = Math.pow(a, b);
                products.add(result);
            }
        }
        return products.size();
    }

    private static int distinctAbInt(int start, int last) {
        HashSet<Integer> products = new HashSet<>();
        for (int a = start; a <= last; a++) {
            for (int b = start; b <= last; b++) {
                double result = Math.pow(a, b);
                products.add((int) result);
            }
        }
        return products.size();
    }

这两个片段的唯一区别是HashSet存储的是Integer或Double元素。startend 分别为2和100。第一个方法使用Double产生9183(正确),但第二个方法使用Integer产生422(错误)。

HashSet的Integer元素是否有一个限制因素,使它产生不同的答案?

hashset
1个回答
0
投票

因为铸造一个非常大的 doubleint 返回 Integer.MAX_VALUE.

System.out.println((int) Math.pow(99,100)); // Prints 2147483647
System.out.println((int) Math.pow(100,100)); // Prints 2147483647

请看 证件 以找到 "缩小基元转换 "说:"该值一定是过大的(幅度大的正值或正无穷大),第一步的结果是类型int或long的最大可表示值。"

© www.soinside.com 2019 - 2024. All rights reserved.