2015-04-19 9 views
4

Я новичок в программировании на Java, но после осмотра на этом сайте я уверен, что это должно сработать.Как превратить массив строк в массив Ints?

public static int[] ArrayStringToArrayInt(String[] arrayString) { 
    int[] arrayInt = new int[arrayString.length]; //Array of Ints for output 

    for (int i = 0; i <= arrayString.length; i++) { //Run through the 
    arrayInt[i] = Integer.parseInt(arrayString[i]); //array, Parsing each 
    }             //item into an int 

    return arrayInt; 
} 

Я хочу этот метод, чтобы сделать, это массив ввода: [ «1», «2», «3»] с каждым элементом является строкой, и вернуться [1,2,3], где каждый элемент является int.

Я вызываю метод с этим кодом

int[] toBeSorted = ArrayStringToArrayInt(inputStringArray); 

В этом случае toBeSorted одновременно объявляется здесь и инициализируется в то же время.

Всякий раз, когда я пытаюсь запустить это я получаю следующее сообщение об ошибке:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 
at sorter.Sorter.ArrayStringToArrayInt(Sorter.java:31) 
at sorter.Sorter.main(Sorter.java:22) 
Java Result: 1 

линия 31 является тело моей цикл, часть, которая делает синтаксический анализ, и линия 22 является местом, где метод называется.

Причина, по которой я нуждаюсь в этом, заключается в том, что я пытаюсь ввести данные от пользователя со классом Scanner и хочу, чтобы они могли вводить множество чисел одновременно. Затем я использую шаблон разделителя, чтобы превратить вход в массив. Хотя это кажется прекрасным, я мог бы только выяснить, как сделать входной массив массив строк, а не ints, что является моей проблемой.

Итак, я думаю, что я прошу 1) Почему мой код не работает? и 2) есть ли более простой способ ввода ввода от пользователя и превратить его в массив значений ints, чем это?

Для тех, кто хотел бы видеть весь свой код, здесь

бит в середине с контрольной переменной и добавление двух чисел это просто способ для меня, чтобы проверить свой код и посмотреть, если это сработало. Он должен показать результат сложения первых двух чисел в списке, который вы ввели

package sorter; 

import java.util.Scanner; 
import java.util.Arrays; 

public class Sorter { 

public static void main(String[] args) { 

    Scanner userInput = new Scanner(System.in); 

    System.out.println("Enter a list to be sorted, seperate numbers by commas:"); 

    String input = userInput.nextLine(); //Gets aan input as a String 
    String delims = "[,]+"; //Use Comma as Delimiter 
    String[] inputStringArray = input.split(delims); //Parse String and creates 
               //an array 

    System.out.println(Arrays.toString(inputStringArray)); //Outputs a string of 
                 //the given array 

    int[] toBeSorted = ArrayStringToArrayInt(inputStringArray); 
    int test = toBeSorted[0] + toBeSorted[1]; 
    System.out.println(test); 
} 

public static int[] ArrayStringToArrayInt(String[] arrayString) { 
    int[] arrayInt = new int[arrayString.length]; //Array of Ints for output 

    for (int i = 0; i <= arrayString.length; i++) { //Run through the 
    arrayInt[i] = Integer.parseInt(arrayString[i]); //array, Parsing each 
    }             //item into an int 

    return arrayInt; 
    } 
} 
+0

'array.length' даст вам номер элемента, а не индекс, поэтому вам нужно изменить условие цикла на' i silentprogrammer

ответ

8

Вы получили диапазон заблуждении петли:

for (int i = 0; i <= arrayString.length; i++) 

должен быть

for (int i = 0; i < arrayString.length; i++) 

действительные индексы массива находятся между 0 и arrayString.length - 1.

В качестве бонуса, вот лучше способ добиться того же с Java 8:

public static int[] ArrayStringToArrayInt(String[] arrayString) 
{ 
    return Stream.of(arrayString).mapToInt(Integer::parseInt).toArray(); 
} 
+0

Большое вам спасибо. Я на мгновение забыл, что индексы массива начинаются с 0, а не 1. Я чувствую себя глупо. –

+0

Подождите, как в мире работает модная новая вещь java 8? –

+0

@Avi, вы должны прочитать о Java 8 Streams – Eran

4

Off-by-one error здесь:

for (int i = 0; i <= arrayString.length; i++) { 
       ^

Оно должно быть:

for (int i = 0; i < arrayString.length; i++) { 
+0

Не так много ошибок, как слишком много итераций. –

+2

@TedHopp Это называется по отдельности ошибкой. Цитируя [Википедия] (http://en.wikipedia.org/wiki/Off-by-one_error): * Это часто происходит в компьютерном программировании, когда итеративный цикл повторяется один раз слишком много или слишком мало. * –

+0

Достаточно честный.Я думал об ошибке fencepost или о переходе от 1 до n вместо 0 в n-1, но я вижу, что современное использование является более общим. –

2

Это неправильный

for (int i = 0; i <= arrayString.length; i++) 

должен быть

for (int i = 0; i < arrayString.length; i++) 

Индексов массива является между 0 и длиной -1

0

Переменной i должен идти от 0 к N-1, N быть длиной массива. Массивы Java, такие как C, основаны на нуле, что означает, что вы должны перебирать их из 0 в N-1. Так что ваш for должен выглядеть следующим образом:

for (int i = 0; i < arrayString.length; i++) 
0

Вы можете использовать поток:

Arrays.stream(arrayString).mapToInt(Integer::parseInt).toArray() 
0

Просто изменить это заявление

for (int i = 0; i <= arrayString.length; i++)

Для

for (int i = 0; i < arrayString.length; i++)

Он будет работать хорошо. ArrayIndexOutOfBoundsException означает, что вы пытаетесь получить доступ к индексу в массиве, который не существует. Например,

int [] a= new int [5];

Тогда индексы, доступные для меня являются

a [0], a [1], a [2], a [3], and a [4]

Я не могу получить доступ к

a [5]

И если я пытаюсь я хотел бы получить ArrayIndexOutOfBoundsException.

Это означает, что индексы массива начинаются с 0 и идут до массива длиной-1.

Надеюсь, это поможет.

Смежные вопросы