无法对Java List进行数学运算

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

我是 Java 的新手,需要根据从用户输入添加到列表中的值来处理

List
/
ArrayList
的一些说明。

用户输入是从具有

UserInput
方法的
getUserInput()
类获得的。此方法接受一个整数
number_inputs
并返回长度为
number_inputs
的用户输入列表。输入类型可能不同(用户可以输入 Integer 或 Double)因此它是通用类型
T
.

UserInput
类看起来像这样:

public class UserInput<T> {
    private List<T> inputs = new ArrayList<>();
    
    public UserInput(List<T> inputs) {
        this.inputs = inputs;
    }
    
    public List<T> getUserInput(Integer number_inputs) {
            for(int i=1; i < number_inputs+1; i++) {
                Scanner input = new Scanner(System.in);
                System.out.println("Enter number " + i);
                T userInput = (T) input.next();
                this.inputs.add(userInput);
            }
            return this.inputs;
    }
    
}

getUserInputs()
然后在主类
CalculateValues
中被调用。给定返回的用户输入列表,我想对这些值执行数学运算(例如求和、除法等)。但是下面的代码无法处理错误:
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')

public class CalculateValues {

    public static void main(String[] args) {
        List<Integer> vals = new ArrayList<>();
        UserInput<Integer> userInput = new UserInput<>(vals);
        List<Integer> inputValues = userInput.getUserInput(2);
        System.out.println(inputValues.get(0) + inputValues.get(1)); // Error occurs here
    }

}

有没有办法不使用数组流来做到这一点?我主要困惑为什么显示错误,因为我在

inputValues
中的列表值已经输入为整数,那么为什么编译器将我的列表值检测为字符串?

java arrays arraylist stream
1个回答
0
投票

我建议的第一件事是减少泛型

T
的范围,并简单地使用一个
Number
对象。这将涵盖
Double
Integer
.

您需要做的是检查

input
中的值。
而不是使用
input.next
,使用
input.nextLine

如果该值包含小数点,则将其添加到

inputs
作为
Double
,否则将其添加为
Integer
.

public class UserInput {
    private List<Number> inputs;

    public UserInput(List<Number> inputs) {
        this.inputs = inputs;
    }

    public List<Number> getUserInput(Integer number_inputs) {
        String string;
        for(int i=1; i < number_inputs+1; i++) {
            Scanner input = new Scanner(System.in);
            System.out.println("Enter number " + i);
            string = input.nextLine();
            if (string.contains(".")) {
                this.inputs.add(Double.parseDouble(string));
            } else {
                this.inputs.add(Integer.parseInt(string));
            }
        }
        return this.inputs;
    }

}

然后,在您的

CalculateValues
课程中,您需要区分结果,并相应地添加。

public class CalculateValues {

    public static void main(String[] args) {
        List<Number> vals = new ArrayList<>();
        UserInput userInput = new UserInput(vals);
        List<Number> inputValues = userInput.getUserInput(2);
        Number numberA = inputValues.get(0);
        Number numberB = inputValues.get(1);
        if (numberA instanceof Integer && numberB instanceof Integer)
            System.out.println(numberA.intValue() + numberB.intValue());
        else if (numberA instanceof Integer && numberB instanceof Double)
            System.out.println(numberA.intValue() + numberB.doubleValue());
        else if (numberA instanceof Double && numberB instanceof Integer)
            System.out.println(numberA.doubleValue() + numberB.intValue());
        else if (numberA instanceof Double && numberB instanceof Double) {
            System.out.println(numberA.doubleValue() + numberB.doubleValue());
        }
    }

}

理想情况下,您可以将所有值存储为

Double
,它有足够的空间容纳
Integer
.

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