【问题标题】:Casting a String Array to ArrayList<Integer>将字符串数组转换为 ArrayList<Integer>
【发布时间】:2014-01-04 07:58:41
【问题描述】:

我正在尝试导入一个 Web 文件,其中包含对应于图形顶点的数字。第一行说明有多少个顶点。所以我定义了一个 int verticesAmount 来对应有多少个顶点。之后,我启动了一个 for 循环来查看文件中每一行的输入,然后使用 .split(" ") 方法将每个数字拆分为一个数组。到目前为止,一切都编译得很好,当我打印出数组时,我刚刚把它打印出来了。但是,当我尝试将数组的每个元素转换为 INT 时,我得到一个编译器错误,我不知道为什么。任何帮助,将不胜感激。谢谢。

import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
public class Graph {

public static void main(String[] args)throws Exception{

    ArrayList<ArrayList<Integer>> array;

    Scanner input2 = new Scanner(System.in);
    System.out.println("Enter a URL");
    String urlString = input2.next();

    java.net.URL url = new java.net.URL(urlString);
    Scanner input = new Scanner(url.openStream());

    String verticesAmount = input.next();
    int amount = Integer.parseInt(verticesAmount);
    String[] stringArray = new String[10];
    ArrayList<Integer> row = new ArrayList<Integer>();

    String line;

    for(int i = 0; i < amount; i++){
        line = input.nextLine();
        stringArray = line.split(" ");
        for(int j = 0; j < stringArray.length; j++)
            row.add(Integer.parseInt(stringArray[j]));

【问题讨论】:

  • 在您的问题中,您说“当我尝试 cast 时”,但我在您的代码中看不到任何强制转换。你指的是parseInt这里吗?您是否在 parseInt 看到错误?
  • 这是我得到的错误:线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“”在 java.lang.NumberFormatException.forInputString(Unknown Source) 在 java.lang。 Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at Graph.main(Graph.java:29)
  • 我明白了。您的数字不会被一个空格隔开。我可以给出答案。
  • 是的,我想我把这两个术语弄混了。我正在尝试将 String 数组的每个元素解析为 int

标签: java arraylist parseint


【解决方案1】:

问题是你要求用一个空格作为分割字符来分割你的行。

如果你要这样分割一行:

SPACE 5 SPACE SPACE 4

在单个空间上,您的结果数组将是

[ "", '5', "", '4' ]

如果您遍历此数组中调用parseInt 的每个字符串,那么您将在空字符串上遇到异常。

一种快速而肮脏的方法是跳过空字符串。如果您也有一个完全空白的行,这也可以帮助您。

在这种情况下,您的拆分呼叫很常见

line.trim().split("\\s+")

它删除了前导和尾随空格,并且还拆分了多个空格。无论哪种方式,请务必跳过空白行。

【讨论】:

    【解决方案2】:

    根据给出的 cmets 和示例代码,您将获得一个 NumberFormatException,因为您的 line.split(" ") 可能包含任何 non-numeric data。请在调用parseInt() 方法之前检查您的输入

    【讨论】:

      【解决方案3】:

      获取数字的一种特定方法是使用正则表达式“\\d+”并使用Matcher#find() 遍历该行。由于您只处理整数,因此这将起作用。正则表达式将根据您的需要而改变(例如,“\\d+\.\\d+” 表示小数等)。

      使用这种技术可以保护您免受多个空格、制表符、错误的非数字字符的影响……几乎任何事情,真的。

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        相关资源
        最近更新 更多