【问题标题】:Java list comparison resulting in error I can't pin downJava 列表比较导致错误我无法确定
【发布时间】:2018-11-06 18:46:29
【问题描述】:

我正在编写此脚本以在 Java 中按顺序比较列表/数组中的元素。本质上,代码采用 CSV,将其转换为列表并迭代列表的大小。当我尝试比较这些值时遇到错误,在这种情况下我无法弄清楚:

线程 "main" java.lang.ClassCastException 中的异常:类 java.lang.String 无法转换为类 java.lang.Float(java.lang.String 和 java.lang.Float 在模块 java.base 中加载程序“引导程序”)
在 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();
        }
    }
}

【问题讨论】:

  • 字符串拆分返回一个字符串。所以 listValues 实际上是一个 ArrayList 但你已经将它声明为一个 ArrayList&lt;Float&gt;
  • 啊,好吧,有道理。如果这澄清了错误,我来自 Python,与此处相比,类型转换非常简单。在这种情况下,我想我生成列表,然后将列表元素转换为浮点数?还是有一个文档可以让我了解如何通过这种方法直接转换为浮点数?
  • new ArrayList 实例化一个原始类型。你应该在那条线上有一个警告。你想要new ArrayList&lt;Float&gt; 或只是new ArrayList&lt;&gt;
  • @DanielPryden:技术上是正确的,但是列表类型之间的转换存在问题,可以在答案中更好地解释。
  • @Makoto:是的,我也看到了。

标签: java arrays list


【解决方案1】:

替换这一行

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。这就是我添加&lt;&gt;的原因。
  • Arrays.asList(checkvalue.split("[\\r\\n]+")) 创建一个 List&lt;String&gt;,它不能转换为 ArrayList&lt;Float&gt;。这就是为什么我将String[] 中的所有内容都映射到Float::parseFloat

或者更简单地说,正如 littleLouito 所建议的那样,

ArrayList<Float> listValues = Arrays.stream(
        checkvalue.split("[\\r\\n]+"))
            .map(Float::parseFloat).collect(Collectors.toCollection(ArrayList::new));

【讨论】:

  • 当您使用toList 创建列表时,ArrayList 的创建毫无意义,因为该列表永远不会被修改。'
  • @Lii 如果不创建new ArrayList,它将无法编译。
  • 你可以使用 Collectors.toCollection(ArrayList::new) 直接收集到一个ArrayList中
  • @RoshanaPitigala:当您说某些东西无法编译时,说明 what 是什么以及它给出了什么错误消息会很有帮助。在这种情况下,问题可能是listValues 变量的类型必须更改为List&lt;Double&gt;。但这在海报代码中是可以的,因为他们不需要列表是ArrayList
【解决方案2】:
 ArrayList<Float> listValues = new ArrayList(Arrays.asList(checkvalue.split("[\\r\\n]+")));

checkvalue.split(...) 返回一个字符串数组。所以这个表达式的右手边建立了一个ArrayList&lt;String[]&gt;。不过,您已将 listValues 声明为 ArrayList&lt;Float&gt;,因此它试图告诉您您的类型不匹配。

要解决这个问题,您需要将字符串解析为浮点数。 Java 的 Float 类有一个不错的 parseFloat 方法,您可以使用。

【讨论】:

  • 您需要使用Float.parseFloat对其进行流式传输和转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多