Этот метод должен был отделять массив playlist1d через каждый символ '|'. а затем отправить их в 2d-массив «playlist2d», но он каждый раз возвращает одну и ту же ошибку.
public String[][] charCounterRow(int songCount, String[] playlist1d)throws IOException{
Character temp;
int characterCount=0, col = 0, rowLength, nullCount=0;
String playlist2d[][] = new String[lineCount][6];
String tempLine = "|", tempString;
for(int counter = 0; counter < lineCount; counter++){
temp = playlist1d[counter].charAt(characterCount);
tempString = String.valueOf(temp);
rowLength = playlist1d[counter].length();
while(characterCount < rowLength && col <= 5){
if (tempString.equals(tempLine)){
characterCount++;
col++;
nullCount = 0;
temp = playlist1d[counter].charAt(characterCount);
tempString = String.valueOf(temp);
}
else if (!tempString.equals(tempLine)){
if (nullCount == 0){
playlist2d[counter][col] = String.valueOf(temp);
}
else{
playlist2d[counter][col] += temp;
}
characterCount++;
temp = playlist1d[counter].charAt(characterCount);
tempString = String.valueOf(temp);
nullCount++;
}
}
characterCount = 0;
col=0;
}
return playlist2d;
}
Проблема продолжает возникать в строке «temp = playlist1d[counter].charAt(characterCount);» под первым оператором «если». Я попытался исправить это, добавив 'col<=5' в цикл while, но по какой-то причине блок кода внутри него продолжает работать, даже если col превышает 5.
Вот текст в массиве:
Это должно быть в плейлисте 1d
private static String[] playlist1d = new String[] {
"List | Title | Artist | Album | Genre | Rating | ",
"1 | qwer | asd | zxcv | asdf | 2 | ",
"2 | wert | sdfg | xcvb | sfdg | 3 | ",
"3 | erty | dfgh | cvbn | dfgh | 1 | ",
"4 | qwer | asdf | zxcv | sedfg | 5 | ",
"5 | wert | sdf | asdf | qwer | 4 | ",
"6 | poij | wert | asdf | bsfs | 4 | ",
"7 | test | fdsf | gfddg | oij | 4 | ",
"8 | tret | gfgd | sdfd | we | 1 | ",
"9 | t | s | d | f | 4 | ",
"10 | poij | wert | sdfgshdg | a | 2 | ",
"11 | qer | asdaf | tsth | sf | ",
"12 | qwer | asdf | zxcv | asfd | 2 |"
};
lineCount и songCount будут просто количеством строк в массиве или в данном случае 13.
Я ожидал, что код в цикле while просто остановится после того, как переменная «col» превысит 5, но по какой-то причине она дошла до 6, после чего появилась ошибка. Я также попробовал сделать col < 5 в цикле while, и это сработало и ограничило col до 4, но это просто не сработало для col < 6 или col <= 5.
Длина 48 означает, что индексы идут от 0 до 47. 48 выходит за пределы...
Я понимаю, что 48 за пределами допустимого, но я не совсем понимаю, как оно вообще достигает 48. В цикле while длина строки равна 48, поэтому я думал, что она просто остановится на 47 или достигнет 5 столбцов.
@Michael Как вы рассчитываете lineCount (думаю, вы частично ответили на этот вопрос, но ваш ответ, похоже, был удален).
О, я понимаю, судя по всему, что это вероятно playlist1d.length.
@tresf Я просто помещаю lineCount в качестве глобальной переменной и редактирую ее по всему коду, пока меняю количество строк в массиве.
Вы увеличиваете и используете новое значение до того, как будет возвращена проверка границ, поэтому таким образом вы, по сути, неизбежно превысите свои границы.
К вашему сведению, еще одна потенциальная ошибка: для трека 11 не указан рейтинг.




Вы пытаетесь получить доступ к персонажу по адресу rowLength. Вы убедитесь, что characterCount меньше rowLength, но затем увеличиваете characterCount++ непосредственно перед использованием.
Одно из решений — прекратить цикл на rowLength -1, чтобы characterCount никогда не превышало размер вашего массива.
rowLength = playlist1d[counter].length();
rowLength = playlist1d[counter].length() - 1;
Таким образом, оператор temp = playlist1d[counter].charAt(characterCount); не пытается получить доступ к элементу, размер которого превышает его собственный размер (классическая проблема «индекс начинается с нуля»).
Другое решение — переместить приращение до тех пор, пока вы не используете индекс, но это может повлиять на другую логику.
Не имеет отношения к делу, но в такие моменты я использую String.split(), чтобы не отслеживать каждого персонажа. Оно может потребовать большей вычислительной мощности, чем ваше решение, но зачастую его легче читать и отлаживать.
Огромное спасибо чувак, наконец-то работает. Этот индексный материал всегда так раздражает, и я всегда с ним путаюсь, поскольку он начинается с 0. Честно говоря, мне бы хотелось использовать эту функцию String.split(), поскольку она кажется довольно полезной для такого рода приложений, но, к сожалению, мои ограничения просто к понятиям, которые я изучил в этом классе, так что :/
Отлично, если вы нашли ответ на решение своей проблемы, вы можете пометить ее как решенную.
Ух, как именно вы решаете пост?
@Майкл, обычно под стрелками вверх и вниз есть флажок, чтобы пометить проблему как решенную. Вы также можете, если хотите, проголосовать за любые вопросы или ответы, которые вы найдете полезными на веб-сайте.
Хорошо, спасибо, я нажал галочку и проголосовал бы за, но, к сожалению, сначала мне нужно 15 репутации. Хотя это определенно было полезно!
Можете ли вы предоставить примеры значений для
int songCount,String[] playlist1dиint lineCount?