Как уже говорили другие, учитывая ограничения на использование массивов и примитивов, ваш код выглядит хорошо, эффективно и требует двух проходов.Если вы можете использовать объекты и коллекции, ваш код можно переписать так, чтобы он был короче и проще.
Инфраструктура коллекций Java
array
в Java специально ограничена в своих возможностях.Основная причина array
состоит в том, чтобы упростить перенос кода с других языков, таких как C. Массив также может быть полезен, когда (a) работа с примитивами и (b) компактное использование памяти являетсяприоритет - не так, как правило, в бизнес-ориентированных приложениях.
Для повседневной работы в Java мы используем многофункциональную инфраструктуру коллекций Java в комплекте с Java или аналогичную инфраструктуру сторонних производителей, напримерas Google Guava .
В Java общая альтернатива array
- это ArrayList
class.Этот класс маскирует использование массивов внизу, чтобы создать иллюзию массива, который увеличивается или уменьшается по мере необходимости.Для списков небольшого размера вы можете просто положиться на это автоматическое изменение размера.
Каркас коллекций обрабатывает только объекты, а не примитивы.Но Java будет использовать функцию auto-boxing , чтобы автоматически преобразовывать ваши int
примитивные значения в Integer
объекты.Объекты занимают больше памяти и немного медленнее, но имеют гораздо большую гибкость.
Java имеет функцию for-each для циклического выполнения массива или коллекции, чтобы упростить синтаксис цикла for
.
Обратите внимание, что «не меньше минимума» - это еще один способ сказать «больше или равно минимуму».Тот же эффект, используйте либо как вопрос стиля.
ArrayList< Integer > numbers = new ArrayList<>() ;
for( int i : data ) { // for-each syntax, to loop an array.
if ( !( i < min ) && ( i < max ) ) { // Half-Open `[)`, beginning/lower is inclusive while the ending/higher is exclusive.
numbers.add( i ) ; // Auto-boxing converts your `int` primitive to an `Integer` object.
} // Else discard this number, and move on to the next.
}
Требуется всего одна петля.Гораздо короче код, легче читать.
Вы, вероятно, захотите вернуть результат как более общий List
, а не ArrayList
.Это полиморфизм в действии, если вы изучили эту концепцию ООП.
public static List< Integer > filterOutTooLowAndTooHigh( int[] ints , int min , int max )
{
ArrayList< Integer > numbers = new ArrayList<>() ;
for( int i : ints ) {
if ( !( i < min ) && ( i < max ) ) {
numbers.add( i ) ;
}
}
return numbers ;
}
Возможно, вы захотите отсортировать возвращаемые числа.Класс Collections
(обратите внимание на множественное число s
) имеет служебные методы для сортировки.
Collections.sort( numbers ) ;
ArrayList
фактически увеличивается за счет выделения нового массива и копирования из старого массива.Таким образом, новый массив может быть больше, чем вам нужно.Поэтому, когда вы закончите добавлять элементы в ArrayList
, вы можете обрезать базовый массив до необходимого минимального размера.
Collections.trimToSize( numbers ) ;
Наконец, если у вас очень большие массивы, вы можете установитьначальный размер ArrayList
.Это позволяет избежать растущего процесса выделения нового массива и копирования, вспенивания, полоскания, повторения.Опять же, не беспокойтесь об этом для массивов размером в десятки, сотни или несколько тысяч, если ваше приложение не выполняет эту работу много раз.
int initialCapacity = 100_000 ;
ArrayList< Integer > numbers = new ArrayList<>( initialCapacity ) ;
Соберите все это вместе.
public static List< Integer > filterOutTooLowAndTooHigh( int[] ints , int min , int max )
{
int initialCapacity = 100_000 ;
ArrayList< Integer > numbers = new ArrayList<>( initialCapacity ) ;
for( int i : ints ) {
if ( !( i < min ) && ( i < max ) ) { // Half-Open `[)`, beginning/lower is inclusive while the ending/higher is exclusive.
numbers.add( i ) ;
}
}
Collections.sort( numbers ) ;
Collections.trimToSize() ;
return numbers ;
}
Я не тестировал этот код, но должен заставить вас двигаться в правильном направлении.
Вы, вероятно, могли бы сделать это в еще меньшем количестве кода, используя потоки Java.Но, как новичок, вы не должны использовать потоки позже.Сначала освоитесь с работой с массивами и коллекциями вручную, как описано здесь.
Кстати, это может помочь вам: Изменение размера массива при сохранении текущих элементов в Java?