我正在研究此脚本,以按顺序比较Java中列表/数组中的元素。本质上,代码采用CSV格式,将其转换为列表,然后遍历列表的大小。当我尝试比较两个值时,遇到错误,在这种情况下我无法弄清楚:
线程“ main”中的异常java.lang.ClassCastException:类java.lang.String无法转换为类java.lang.Float(java.lang.String和java.lang.Float在模块java.base中加载程序'bootstrap')
在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();
}
}
}
答案 0 :(得分:4)
替换此行
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));
答案 1 :(得分:0)
ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));
checkvalue.split(...)
返回一个字符串数组。因此,该表达式的右侧建立了一个ArrayList<String[]>
。不过,您已经将listValues
声明为ArrayList<Float>
,因此它试图告诉您类型不匹配。
要解决,您需要将字符串解析为浮点数。 Java的Float类具有一个不错的parseFloat
方法,您可以使用。