Так как мы заранее не знаем, сколько чисел может лежать между заданными двумя числами start
и end
, то есть два варианта.
- Использовать массив, но выделить заранее очень много памяти. Разумеется, такой подход очень плох, и поэтому его мы рассматривать не будем.
- Использовать коллекции: они могут расширяться "на ходу", таким образом, сколько чисел будет лежать между
start
и end
, - ровно столько мы и добавим.
Ниже приведён вариант, как можно исправить ваш код, используя коллекции.
public static List<Integer> getSubArrayBetween(int[] numbers, int start, int end) {
List<Integer> integers = new ArrayList<>();
for (Integer integer : numbers) {
if (integer >= start && integer <= end) {
integers.add(integer);
}
}
return integers;
}
Чтобы вернуть именно массив, код можно изменить так:
public static Integer[] getSubArrayBetween(int[] numbers, int start, int end) {
List<Integer> integers = new ArrayList<>();
for (Integer integer : numbers) {
if (integer >= start && integer <= end) {
integers.add(integer);
}
}
return integers.toArray(new Integer[0]);
}
Хотя в таком варианте возвращается массив оболочек Integer
, а не примитивного типа данных int
. Вернуть массив именно int
можно, если использовать Stream API, с которым задача решается в целом проще (при условии, если все числа в массиве действительно идут по возрастанию).
public static int[] getSubArrayBetween(int[] numbers, int start, int end) {
return IntStream.of(numbers)
.filter(integer -> integer >= start && integer <= end)
.toArray();
}