Java列表比较导致错误我无法固定

时间:2018-11-06 18:46:30

标签: java arrays list

我正在研究此脚本,以按顺序比较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();
        }
    }
}

2 个答案:

答案 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方法,您可以使用。