Я пытаюсь создать новый массив с учетом минимальных и максимальных значений из другого массива - PullRequest
3 голосов
/ 16 июня 2019

Учитывая данные массива [], minValue и maxValue, создайте метод, который возвращает массив, состоящий исключительно из значений из data [], между minValue (включительно и maxValue (эксклюзив).

Я на самом деле сделал проблему, но мне интересно, есть ли более чистый (менее нубский) способ сделать это. Чтобы получить размер моего temp [], я фактически делаю полный цикл, который работал, но кажется неуклюжим.

public static int[] superSweetFilterMethod(int[] data, int minValue, int maxValue) {
    int j = 0;
    for (int i =0; i < data.length ; i++) {
      if (data[i] >= minValue && data[i] < maxValue) {
        j++;
      }
    }
    int k = 0;
    int[] temp = new int[j];
    for (int i =0; i < data.length ; i++){
      if(data[i] >= minValue&& data[i] < maxValue){
        temp[k] = data[i];
        k++;
      }
    }
    return temp;
  }

Как я уже сказал, это работает, я просто хотел бы сделать гад. Спасибо за урок, мудрые.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Как уже говорили другие, учитывая ограничения на использование массивов и примитивов, ваш код выглядит хорошо, эффективно и требует двух проходов.Если вы можете использовать объекты и коллекции, ваш код можно переписать так, чтобы он был короче и проще.

Инфраструктура коллекций 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?

2 голосов
/ 16 июня 2019

Вы можете избежать зацикливания дважды с одним и тем же предложением if, инициализируя временный массив того же размера, что и исходный массив, и используя счетчик int для отслеживания количества элементов в своем временном массиве.

Нозатем, перед возвратом временного массива, вам все равно нужно уменьшить его размер.Это можно сделать с помощью служебного метода Arrays.copyOfRange.(который по-прежнему является внутренним циклом, но без повторения предложения if)

Мне больше нравится решение (комментарий) @Sagar Ch (ArrayList), потому что оно более читабельно и отслеживает количество элементов длявы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...