Как остановить выполнение цикла n раз?

#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, и это именно то, что мне нужно. Спасибо за вашу помощь