#java
#Ява
Вопрос:
у меня возникла проблема, когда я хотел бы, чтобы приведенный ниже код добавлял указанные элементы из первого массива в новый массив по заданным индексам. Однако проблема в том, что цикл с не выходом.
Например. Ниже следует распечатать элементы с индексами 4 и 5, а затем выйти, так как в массиве есть только элементы, проиндексированные до 5. Однако он печатает «the», «mat», за которыми следуют «null» и «null».
Любые советы будут оценены по достоинству. Он должен пройти следующие тесты, которых нет в приведенных ниже советах. «‘ @Test public void _2c_pagedData_reflection() вызывает исключение {
String[] data = {"the", "cat", "sat", "on", "the", "mat"}; { final String[] expected2n2 = {"sat", "on"}; final String[] result = tester.executeStatic(String[].class, "pagedData", data, 2, 2); assertArrayEquals(expected2n2, result); } { final String[] expected4n4 = {"the", "mat"}; final String[] result = tester.executeStatic(String[].class, "pagedData", data, 4, 4); assertArrayEquals(expected4n4, result); } { final String[] expected2n3 = {"sat", "on", "the"}; final String[] result = tester.executeStatic(String[].class, "pagedData", data, 2, 3); assertArrayEquals(expected2n3, result); } }'''
‘
package com.company; public class Main { public static void main(String[] args) { String[] data = {"the", "cat", "sat", "on", "the", "mat"}; String[] lol = pagedData(data, 4, 4); for (int i = 0; i lt; lol.length; i ) { System.out.println(lol[i]); } } static String[] pagedData(String[] array, int startIndex, int maxSize) { String[] newArray = new String[maxSize]; int count = 1; for (int i = 0; i lt; newArray.length; i ) { if (startIndex lt; array.length) { String index = array[startIndex]; newArray[i] = index; startIndex ; count ; } } return newArray; } }
Комментарии:
1. почему он перестал печатать? просто потому, что вы перестаете добавлять элементы, это не значит, что размер вашего массива будет ограничен
Ответ №1:
Вы создаете пустой массив размером 4, и вы хотите скопировать только 2 последних значения из входного значения. Таким образом, последние два значения равны нулю.
static String[] pagedData(String[] array, int startIndex, int maxSize) { if(array.length - maxSizelt;1){ // edge case return new String[0]; } String[] newArray = new String[array.length - maxSize]; ... return newArray; }
Вы могли бы использовать список вместо массива, таким образом, вы могли бы полностью пропустить эту проблему. Во-вторых, преобразование из списка в массив является прямым
static String[] pagedData(String[] array, int startIndex, int maxSize) { int counter = 0; Listlt;Stringgt; results = new ArrayListlt;gt;(); for (int i = startIndex; i lt; array.length amp;amp; counter lt;= maxSize; i ) { String index = array[startIndex]; results.add(index); counter ; } return results.toArray(new String[0]); }
Результат:
["the", "mat"]
Комментарии:
1. Я получаю ошибку «java достиг конца файла при разборе» при попытке использовать код списка?
2. Есть ли какие-либо незакрытые скобки? В моем коде я удалил оператор if, возможно, они остались
Ответ №2:
Вы создаете экземпляр массива длины maxSize
(т. Е. 4), хотя он будет копировать в этот массив только 2 элемента, поэтому остальные 2 элемента равны нулю. Вычислите размер возвращаемого массива из array.length
и startIndex
, а затем ограничьте его maxSize
. Используется System.arrayCopy()
для копирования массивов.
static String[] pagedData(String[] array, int startIndex, int maxSize) { int length = array.length - startIndex; if (length gt; maxSize) { length = maxSize; } String[] slice = new String[length]; System.arrayCopy(array, startIndex, slice, 0, length); return slice; }
Изменить: добавление образца теста JUnit
@Test public void testSlice() { String[] array = {"the","cat","sat","on","the","mat"}; int startIndex = 4; int maxSize = 4; String[] expected = {"the","mat"}; String[] actual = Testing.pagedData(array, startIndex, maxSize); Assert.assertArrayEquals(expected, actual); }
Комментарии:
1. Я отредактировал исходный пост, так как вышеизложенное не проходит необходимых тестов.
2. @ItchyPrune Я добавил простой тест JUnit, который проходит с моим кодом (и должен пройти с ответом Бери). Похоже, что ваш тест вызывает метод с помощью отражения, что не является необходимым и может быть ошибочным. Дает ли он вам какую-либо обратную связь, когда терпит неудачу? Является
tester
ли пользовательский класс? Есть ли в вашем классе более одного метода с именемpagedData
?3. Привет, я не дошел до использования системного класса с arraycopy в своем обучении, но это гораздо более эффективный способ сделать это, спасибо!. Изначально это не работало, так как arraycopy учитывал регистр, а копия имела заглавную букву C. Я изучил метод arraycopy, и это именно то, что мне нужно. Спасибо за вашу помощь