如何确定使用哪种数据类型来存储整数?

时间:2015-08-20 18:26:14

标签: java

我想确定一组给定的数字用于存储它们的数据类型。 这是我的代码

public class DataType {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int num;

        Scanner input = new Scanner(System.in);
        System.out.println("Enter the number of inputs you want to take");
        num = input.nextInt();
        try {
        Long []test = new Long[num];
        for(int i =0;i<num;i++){
            test[i]= (long) input.nextInt();
        }


        System.out.println("output:");
        for(int i =0;i<num;i++){
            if(test[i]>=Integer.MIN_VALUE && test[i]<=Integer.MAX_VALUE && test[i]>= Byte.MIN_VALUE && test[i]<= Byte.MAX_VALUE  && test[i]>= Short.MIN_VALUE && test[i]<= Short.MAX_VALUE && test[i]>= Long.MIN_VALUE && test[i]<= Long.MAX_VALUE){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* short");
                System.out.println("* int");
                System.out.println("* Long");
                System.out.println("* Byte");
            }

            else if(test[i]>=Integer.MIN_VALUE && test[i]<=Integer.MAX_VALUE ){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* int");
            }

            else if(test[i]>= Byte.MIN_VALUE && test[i]<= Byte.MAX_VALUE  ){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* Byte");
            }

            else if(test[i]>= Short.MIN_VALUE && test[i]<= Short.MAX_VALUE  ){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* short");
            }

            else if(test[i]>= Long.MIN_VALUE && test[i]<= Long.MAX_VALUE ){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* Long");
            }

            else if(test[i]>=Integer.MIN_VALUE && test[i]<=Integer.MAX_VALUE && test[i]>= Long.MIN_VALUE && test[i]<= Long.MAX_VALUE ){
                System.out.println(test[i]+ "can be fitted in");
                System.out.println("* int");
                System.out.println("* Long");
            }

            else{
                System.out.println("Sorry!!!");
            }

        }

    }
    catch (ArrayIndexOutOfBoundsException e){
        System.out.println("can't be fitted in");
    }
}
}

输入是: 五 -150 150000 15亿 213333333333333333333333333333333333 -100000000000000 预期产量: -150可适用于: *简短 * int * 长 150000可以安装在: * int * 长 1500000000可以安装在: * int * 长 213333333333333333333333333333333333无法安装在任何地方。 -100000000000000可以安装在: *长

但我得到的输出是这样的:

输出: -150可以安装 * int 150000可以安装 * int 1500000000可以安装 * int

任何人都可以告诉我为什么我为每个整数获得类似的数据类型?

1 个答案:

答案 0 :(得分:1)

首先,阅读像test[i]= (long) input.nextInt();这样的数字没有任何意义。您正在将长数字截断为int。从您的测试用例来看,您需要长算术数据类型,例如BigIntegerScanner能够使用nextBigInteger()方法读取它。

其次,您的程序按预期工作。由于您对所有分支都有else if个构造,因此只会选择第一个匹配的分支。对于所有测试用例,第二个分支(检查int)是第一个匹配的分支。

如果您需要匹配所有适合当前数字的类型,我建议为此目的引入特殊数据类型。 Enum是完美的候选人。

import java.math.BigInteger;
import java.util.EnumSet;
import java.util.Scanner;

public class DataTypeTest {

    enum DataType {
        BYTE("byte", BigInteger.valueOf(Byte.MIN_VALUE), BigInteger.valueOf(Byte.MAX_VALUE)),
        SHORT("short", BigInteger.valueOf(Short.MIN_VALUE), BigInteger.valueOf(Short.MAX_VALUE)),
        INTEGER("int", BigInteger.valueOf(Integer.MIN_VALUE), BigInteger.valueOf(Integer.MAX_VALUE)),
        LONG("long", BigInteger.valueOf(Long.MIN_VALUE), BigInteger.valueOf(Long.MAX_VALUE));

        private final String name;
        private final BigInteger lowerBound;
        private final BigInteger upperBound;

        DataType(String name, BigInteger lowerBound, BigInteger upperBound) {
            this.name = name;
            this.lowerBound = lowerBound;
            this.upperBound = upperBound;
        }

        public String getName() {
            return name;
        }

        public boolean eligible(BigInteger number) {
            return lowerBound.compareTo(number) <= 0 && number.compareTo(upperBound) <= 0;
        }

        public static EnumSet<DataType> findAllEligible(BigInteger number) {
            EnumSet<DataType> results = EnumSet.noneOf(DataType.class);
            for (DataType dataType : values()) {
                if (dataType.eligible(number)) {
                    results.add(dataType);
                }
            }
            return results;
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter the number of inputs you want to take");
        int num = input.nextInt();
        BigInteger [] tests  = new BigInteger [num];
        for (int i = 0; i < tests.length; i++) {
            tests[i] = input.nextBigInteger();
        }

        for (BigInteger number : tests) {
            System.out.println(number + " can be fit in:");
            EnumSet<DataType> dataTypes = DataType.findAllEligible(number);
            if (dataTypes.isEmpty()) {
                System.out.println("None");
            } else {
                for (DataType type : dataTypes) {
                    System.out.println("* "  + type.getName());
                }
            }
        }
    }
}

结果:

Enter the number of inputs you want to take: 6
5 -150 150000 1500000000 213333333333333333333333333333333333 -100000000000000

5 can be fit in:
* byte
* short
* int
* long
-150 can be fit in:
* short
* int
* long
150000 can be fit in:
* int
* long
1500000000 can be fit in:
* int
* long
213333333333333333333333333333333333 can be fit in:
None
-100000000000000 can be fit in:
* long