我想确定一组给定的数字用于存储它们的数据类型。 这是我的代码
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
任何人都可以告诉我为什么我为每个整数获得类似的数据类型?
答案 0 :(得分:1)
首先,阅读像test[i]= (long) input.nextInt();
这样的数字没有任何意义。您正在将长数字截断为int。从您的测试用例来看,您需要长算术数据类型,例如BigInteger
。 Scanner
能够使用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