我正在编写这个脚本来按顺序比较 Java 中列表/数组中的元素。本质上,该代码接收 CSV,将其转换为列表并迭代列表的大小。当我尝试比较值时遇到错误,在这种情况下我无法弄清楚:
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Float (java.lang.String and java.lang.Float are in module java.base of loader 'bootstrap')
at list.main(list.java:22)
代码是:
public class list{
public static void main(String[] args){
System.out.println("Enter your filename");
Scanner inputValue = new Scanner(System.in);
String fileLocation = inputValue.nextLine();
try {
String checkvalue = new String(Files.readAllBytes(Paths.get(fileLocation)));
ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));
System.out.println(listValues);
for (int i = 0; i < listValues.size(); i++){
System.out.println(listValues.get(i));
float valueA = listValues.get(i);
float valueB = listValues.get(i+1);
if (valueA <= valueB){
System.out.println("True");
}
}
}
catch (IOException e){
e.printStackTrace();
}
}
}
最佳答案
替换此行
ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));
这样:
ArrayList<Float> listValues = new ArrayList<>(
Arrays.stream(
checkvalue.split("[\\r\\n]+"))
.map(Float::parseFloat).collect(Collectors.toList()
)
);
你有两个主要错误
-
new ArrayList
创建一个原始类型。 And you should not use raw types 。这就是为什么我添加了<>
. -
Arrays.asList(checkvalue.split("[\\r\\n]+"))
创建List<String>
,无法转换为ArrayList<Float>
。这就是为什么我将所有内容映射到String[]
中。与Float::parseFloat
.
或者更简单地说,正如littleLouito所建议的,
ArrayList<Float> listValues = Arrays.stream(
checkvalue.split("[\\r\\n]+"))
.map(Float::parseFloat).collect(Collectors.toCollection(ArrayList::new));
关于Java列表比较导致错误我无法确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53178117/