将字符串数组转换为整数数组

Converting String Array to an Integer Array

提问人:Mario 提问时间:9/17/2013 最后编辑:NoctisMario 更新时间:11/23/2022 访问量:286160

问:

因此,基本上用户从扫描仪输入输入序列。等。 它可以是任何长度,并且必须是整数。

我想将字符串输入转换为整数数组。
所以会是,会是,等等。
12, 3, 4int[0]12int[1]3

有什么技巧和想法吗?我正在考虑实现获取以前的数字并将它们解析在一起并将其应用于数组中的当前可用插槽。但我不太确定如何编码。if charat(i) == ','

Java 字符串 整数 输入 数据操作

评论

0赞 Daniel Gabriel 9/17/2013
扫描仪输入的代码是什么?
1赞 Bojan Dević 9/17/2013
这是一个重复的问题 stackoverflow.com/questions/6881458/......
0赞 Bram Van Dyck 4/25/2017
这里有一个应该可以帮助你的功能:stackoverflow.com/a/43613298/7919904
1赞 Mr. Jain 8/9/2020
这回答了你的问题吗?将字符串数组转换为 Int 数组

答:

73赞 Java Devil 9/17/2013 #1

你可以从扫描仪中读取整个输入行,然后拆分该行,然后你有一个,将每个数字解析为索引一比一匹配......(假设输入有效且没有)喜欢,String[]int[]NumberFormatExceptions

String line = scanner.nextLine();
String[] numberStrs = line.split(",");
int[] numbers = new int[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)
{
   // Note that this is assuming valid input
   // If you want to check then add a try/catch 
   // and another index for the numbers if to continue adding the others (see below)
   numbers[i] = Integer.parseInt(numberStrs[i]);
}

正如 YoYo 的回答所暗示的那样,上述内容可以在 Java 8 中更简洁地实现:

int[] numbers = Arrays.stream(line.split(",")).mapToInt(Integer::parseInt).toArray();  

处理无效输入

在这种情况下,您需要考虑需要做什么,您想知道该元素的输入是否错误,或者只是跳过它。

如果您不需要了解无效输入,而只是想继续解析数组,您可以执行以下操作:

int index = 0;
for(int i = 0;i < numberStrs.length;i++)
{
    try
    {
        numbers[index] = Integer.parseInt(numberStrs[i]);
        index++;
    }
    catch (NumberFormatException nfe)
    {
        //Do nothing or you could print error if you want
    }
}
// Now there will be a number of 'invalid' elements 
// at the end which will need to be trimmed
numbers = Arrays.copyOf(numbers, index);

我们应该修剪结果数组的原因是,末尾的无效元素由 a 表示,这些元素需要被删除,以便区分有效的输入值 。int[]00

结果

输入:“2,5,6,bad,10”
输出:[2,3,6,10]

如果您稍后需要了解无效输入,您可以执行以下操作:

Integer[] numbers = new Integer[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)        
{
    try 
    {
        numbers[i] = Integer.parseInt(numberStrs[i]);
    }
    catch (NumberFormatException nfe)   
    {
        numbers[i] = null;
    }
}

在这种情况下,错误的输入(不是有效的整数)元素将为 null。

结果

输入:“2,5,6,bad,10”
输出:[2,3,6,null,10]


您可以通过不捕获异常来提高性能(有关详细信息,请参阅此问题),并使用其他方法来检查有效整数。

评论

0赞 Euridice01 11/8/2014
Java Devil,你说的这个“//和另一个数字索引,如果继续添加其他索引”是什么意思?如果我想将其他的添加到数组中,该怎么办?
0赞 Java Devil 11/10/2014
@Euridice01 这只是一个处理无效输入的建议。考虑输入 。这里会导致 a,所以如果继续用作索引,则在整数数组的第三个位置会有 a。这仅取决于您想如何处理这种情况。我说的额外索引是忽略 所以 在最后一个整数数组中,第三个数字将是 .4,6,z,10zNumberFormatExceptioninullz10
0赞 Shreyansh 5/21/2015 #2
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class MultiArg {

    Scanner sc;
    int n;
    String as;
    List<Integer> numList = new ArrayList<Integer>();

    public void fun() {
        sc = new Scanner(System.in);
        System.out.println("enter value");
        while (sc.hasNextInt())
            as = sc.nextLine();
    }

    public void diplay() {
        System.out.println("x");
        Integer[] num = numList.toArray(new Integer[numList.size()]);
        System.out.println("show value " + as);
        for (Integer m : num) {
            System.out.println("\t" + m);
        }
    }
}

但是要终止 while 循环,您必须将任何字符放在输入的末尾。

例如输入:

12 34 56 78 45 67 .

输出:

12 34 56 78 45 67
42赞 YoYo 5/8/2016 #3

逐行

int [] v = Stream.of(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();

替代方案为Arrays.stream()

int [] v = Arrays.stream(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();

但是,对于解析较大的文本块来说,更好的是

int [] v = Pattern.compile(",\\s+").splitAsStream(line)
  .mapToInt(Integer::parseInt)
  .toArray();  

由于这不需要字符串数组在内存中,因此我们进行增量解析以生成整数。此外,由于 的输入是 ,而不仅仅是 ,我们现在还可以使用缓冲字符源来避免在内存中拥有完整的输入源。splitAsStreamCharSequeceString

另请参阅如何创建正则表达式匹配流?,以获取有关增量解析的更多有趣阅读。

6赞 Ritam Chakraborty 7/23/2019 #4

Stream.of().mapToInt().toArray()似乎是最好的选择。

int[] arr = Stream.of(new String[]{"1", "2", "3"})
                  .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));
-3赞 Alex 8/30/2020 #5

Java 有一个方法,“convertStringArrayToIntArray”。

String numbers = sc.nextLine();
int[] intArray = convertStringArrayToIntArray(numbers.split(", "));

评论

0赞 Evgeny Mamaev 8/30/2020
它是哪个包和类?
0赞 Mavaddat Javid 5/2/2021
@EugeneMamaev它在 github.com/petrnohejl/Alfonz/blob/......org.alfonz.utility
2赞 Shubham Chaudhary 11/18/2020 #6

将 String 数组转换为流并映射到 int 是 java 8 中可用的最佳选择。

    String[] stringArray = new String[] { "0", "1", "2" };
    int[] intArray = Stream.of(stringArray).mapToInt(Integer::parseInt).toArray();
    System.out.println(Arrays.toString(intArray));

评论

0赞 YoYo 11/23/2022
同样,这仅涵盖转换 --> 的替代形式,而不是 -->(缺少分隔符解析步骤)。String []int []Stringint []
5赞 Anton Saburov 2/5/2021 #7

对于 Java 8 及更高版本:

    String[] test = {"1", "2", "3", "4", "5"};
    int[] ints = Arrays.stream(test).mapToInt(Integer::parseInt).toArray();

评论

0赞 YoYo 11/23/2022
没有回答“我想将字符串输入转换为整数数组”,并且这部分答案在其他答案中已经充分涵盖,尽管您确实提供了替代方法而不是 .Arrays.stream()Stream.of()