0

Я разбираю файл .CSV, строку после строки, и я хочу получить значения столбцов. Так как пример для моего файла .CSV:Не удается получить доступ к последнему элементу массива

time;columnA;columnB,ColumnC 
27-08-2013 14:43:00; this is a text; this too; same here 

Так что я сделал это сохранить содержимое в двумерном массиве строк (спасибо расколоть()). Мой массив выполнен следующим образом:

array[0][x] = "time". 
array[y][x] = "27-08-2013 14:43:00"; 

они х различных столбцов, но имя каждого столбца сохраняется только в строке [0] [х]. это разные строки, со значением, хранящимся в нем как String.

Моя проблема заключается в следующем: я хочу получить позицию [x] данных, но когда я попытаюсь получить доступ к последнему элементу [x] массива. я получаю это как сообщения об ошибке

java.lang.ArrayIndexOutOfBoundsException: 17 
    at IOControl.ReadCsvFile.getPosVar(ReadCsvFile.java:22) 
    at IOControl.ReadCsvFile.<init>(ReadCsvFile.java:121) 
    at en.window.Main.main(Main.java:48) 

Очевидно, я читаю далеко, но как?

Вот мой код:

//Retrieves the x position of the variable var given as parameter. 
private int getPosVar(String[][] index, String var) 
{ 
    int x = 0; 
    boolean cond = false; 
    while((index[0][x] != null) && (cond != true)) 
    { 
     if (index[0][x].contains(var) == true) 
     { 
      cond = true; 
     } 
     x++; 
    } 
    System.out.println("x = " +x+ " val = " +index[0][x]); 
    return(x); 
} 

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

x < index[x].length 

Но на самом деле я ничего не изменил, и когда я даю неизвестную String var также заходит слишком далеко. Почему?

+0

У вас есть 4 столбца, но попытайтесь получить доступ к 17? –

+0

Нет, в моем реальном файле теста у меня есть огромное количество данных, для понимания цели я их вырезал. Но на самом деле у меня есть 17 столбцов, и я пытаюсь получить доступ к 17-му;) – trolologuy

+0

Если у вас есть 17 столбцов, последний индекс равен 16, так как индексирование начинается с 0. Пройдите через свой код с помощью отладчика. –

ответ

2

Проверка достоверности индекса перед использованием также хорошая идея:

if (index == null || index.length == 0) return -1; 

Ваш цикл в то время как должен выглядеть следующим образом:

while (x < index[0].length) 
{ 
    if (index[0][x] == null) 
    { 
     x++; 
     continue; // skip possible null entries. 
    } 

    if (index[0][x].contains(var)) 
    { 
     System.out.println("x = " + x + ", val = " + index[0][x]); 
     return x; // return the position found. 
    } 
    x++; 
} 
return -1; 

Используя цикл (который я предпочитаю) :

for (int x = 0; x < index[0].length; x++) 
{ 
    if (index[0][x] == null) 
     continue; // skip possible null entries. 

    if (index[0][x].contains(var)) 
    { 
     System.out.println("x = " + x + ", val = " + index[0][x]); 
     return x; // return the position found. 
    } 
} 
+0

Я не думал, что это может быть так просто: o Странно. Перерыв, безусловно, очень полезно! Спасибо большое! – trolologuy

+0

@trolologuy, используйте 'break', если вам нужно оставаться внутри метода, иначе просто используйте' return', чтобы вернуть результат, который вам нужен. – munyul

0

Вы полностью игнорируете границы массива. Где вы убедитесь, что в вашем цикле while ваша переменная x не слишком велика? Нигде.

+0

Я пробовал это: 'x trolologuy

1

< х индекс [х] .length

Вопрос не длина index[x], но x слишком велик. Вам необходимо проверить:

index.length < x 
+0

hmmm, поэтому, когда я делаю индекс [x], я проверяю длину строки в индексе [x], и когда я просто проверяю x, это не то же самое? – trolologuy

+0

@trolologuy 'index.length' - это длина основного массива,' index [x] .length' - длина массива в позиции 'x'. 'index [x] [y] .length' будет длиной строки в' (x, y) '. – kiheru

+0

Ну, вполне логично, в конце концов ^^ Большое спасибо, я так и не понял этого, теперь я все понял. – trolologuy

0

В конце цикла while вы увеличиваете значение x. Впоследствии вы попытаетесь снова получить значение в методе sysout.

EDIT: попробуйте поместить x ++ в блок else.

1

вы должны проверить против

x < index[0].length 

, и было бы хорошо, чтобы проверить

index != null && index.length > 0 

перед обращением к индексу на всех.

После того, как вы нашли правильный результат, ваш код также увеличивает «x ++», так что x перемещает один элемент дальше. Если теперь найти последний элемент или/нет элементов, то это не удастся выйти за пределы границ массива, таким образом

System.out.println("x = " +x+ " val = " +index[0][x]); 

выдаст ошибку.

Я хотел бы предложить, чтобы изменить его так:

private int getPosVar(String[][] index, String var) 
{ 
    int x = 0; 
    boolean found = false; 

    if(index == null || index.length == 0 || var == null) 
     return -1; 

    while((x < index[0].length)) 
    { 
     if (index[0][x].contains(var)) 
     { 
      System.out.println("x = " +x+ " val = " +index[0][x]); 
      return(x); 
     } 
     x++; 
    } 
    System.out.println(" var = " + var + " not found"); 
    return -1; 
} 
0

Becase вы приращение значения после того, как вы делаете чек. Это приводит к тому, что следующая проверка слишком велика. Вы можете решить это, просто добавив тормозное заявление, подобное этому.

public static void main(String[] args) { 
    String var = "c"; 
    String[][] index = {{"a","b","c"},{"a","b","c"}}; 
    int x = 0; 
    boolean cond = false; 
    while((index[0][x] != null) && (cond != true)) 
    { 
     if (index[0][x].contains(var) == true) 
     { 
      cond = true; 
      break; 
     } 
     x++; 
    } 
    System.out.println("x = " +x+ " val = " +index[0][x]); 

Кроме того, вы всегда должны пытаться использовать forloop вместо петли, пока они делают это гораздо труднее получить ошибки, как это, если вы проверить длину массива.

0

Вы можете использовать старую программу

общественного класса TwoDStringArray {

static String[][] index = new String[1][3]; 

public static void main(String[] args) { 

    index[0][0] = "amal"; 
    index[0][1] = "dev"; 

    int x = 0; 
    boolean cond = false; 
    String var = "dev"; 
    while((index[0][x] != null) && (cond != true)) 
    { 

     if (index[0][x++].equals(var) == true) 
     { 
      cond = true; 
      x--; 
     } 
    } 

    System.out.println("x = " +x+ " val = " +index[0][x] + " "+ cond); 
} 

}

O/P ---- >>>

х = 1 = вал Dev true


, но вы должны заметить одну вещь, когда объявляете static String [] [] index = new String [1] [3];

здесь компилятор инициализировать 'индекс' с индексом [0] [0] = нуль, индекс [0] [1] = нуль, индекс [0] [2] не = NULL

но нет индекс [0] [3]

поэтому он будет показывать ArrayIndexOutOfBoundsException

так сделать одну вещь, если есть 'N' элементы в вашей программе затем объявить 'индекс' как этот

статической String [] [] index = new Строка [1] [n + 1];

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