2012-01-19 2 views
3

Моя цель - написать метод, который создает копию массива с удаленными нечетными номерами. Вот мой код:Как удалить нечетные элементы из массива?

public class Evens { 
    static int[] evens(int[] input) { 
     final int n = input.length; 
     int[] output = new int[n]; 
     for(int i=0;i<n;i++) { 
      if(input[i]%2 == 0) 
       output[i] = input[i]; 
     } 
     return output; 
    } 
    public static void main(String[] args) { 
     int[] fvalues = new int[] {4,7,9,3,6,8,2}; 
     int[] evalues = evens(fvalues); 
     for(int i=0;i<evalues.length;i++) 
      System.out.println(i+"] "+evalues[i]); 
    } 
} 

Когда я запускаю его, он дает мне элементы массива со всеми четными номерами исходного массива, но с нулями, где нечетные числа были. Как я могу написать его, чтобы не было нулей с нечетными номерами?

+1

Пожалуйста, отметьте как домашнюю работу, если это так. –

+1

это домашнее задание? – hvgotcodes

+0

Да, это так. Я добавил тег. –

ответ

1

Для удаления элемента вам лучше использовать ArrayList, так как массив не может изменить его размер. Если у вас есть , необходимо использовать массивы, то массив output должен быть короче, чем input. Скажем, если вы собираетесь удалить три элемента, то размер output должен быть input.length-3.

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

Вы можете сделать это:

  1. Подсчитать количество четных элементов
  2. Создать новый выходной массив с длиной найденного на предыдущем шаге
  3. Копирование только четные числа в выходной массив. Это немного сложно, так как вам нужно использовать два индекса (но только один для цикла): один индекс для итерации по входному массиву, а другой для итерации по выходному массиву - индекс для входного массива получает приращение, как обычно, для каждого шага итерации, но индекс для выходного массива получает приращение только после добавления нового четного элемента к выходу.
+0

Мне нужно, чтобы он работал с любым массивом длины, поэтому мне нужно, чтобы он был общим. –

+0

@ DylanBroussard - Оскар просто дает вам пример, чтобы помочь вам разобраться в вашем алгоритме. Третий абзац - хорошее предложение. –

+0

@ DylanBroussard Я отредактировал свой ответ, добавив более подробную информацию, это насколько я могу идти, поскольку это домашнее задание. –

-1

Вы должны учитывать, что поля массива примитивного типа, такие как int, не должны быть пустыми, пустыми или чем-то похожими, они должны быть целым числом (в вашем случае 0).

Также размер массива фиксируется с момента его объявления и не может быть изменен в будущем.

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

несколько простых советов:

public class Evens { 
    static int[] evens(int[] input) { 
     final int n = input.length; 

     int[] output = new int[n]; 

     // consider adding some additional lines 

     } 
     // return ... 
     // hint: use something slightly different that your output array 
    } 
    public static void main(String[] args) { 
     int[] fvalues = new int[] {4,7,9,3,6,8,2}; 
     int[] evalues = evens(fvalues); 
     for(int i=0;i<evalues.length;i++) 
      System.out.println(i+"] "+evalues[i]); 
    } 
+2

Этот вопрос помечен как домашнее задание. Пожалуйста, укажите направление, а не полный ответ. – Peter

+1

Не было, когда я ответил на вопрос! –

+2

Он не был помечен как домашнее задание до минуты назад. После ответа Марк ответил. –

0

вы сдерживаются памяти здесь (reqt этого домашнего задания.)?

Я бы сделал это (чтобы сделать его немного сложным).

  1. Для каждого элемента, который необходимо удалить, установите этот элемент как «0» или какой-либо из существующих. (позволяет называть это «A» для ex.) в массиве.
  2. После того, как вы обновили исходный массив, теперь начните перезаписывать все «A» в этом массиве со следующим допустимым элементом (например, A 1 2 A 4 5 A 6 должно стать 1 2 4 5 6 A A A).Возможно, вам придется действовать в нескольких случаях «A» в какой-то момент
  3. либо вы можете распечатать этот массив, пока не нажмете A (работая с теми же ограничениями памяти), или скопируйте его в новый массив с необходимыми элементами.

Этот процесс, хотя и сложный, даст некоторую реальную практику как часть домашней работы.

0

Ваш вопрос не указывает, есть ли у вас какие-либо ограничения в отношении типа алгоритма, который вы можете использовать. Предполагая, что у вас есть свобода делать все, что вы хотите, я бы предложил использовать List для хранения четных значений, когда вы перебираете полный массив и копируете любые четные числа в список.

Существует несколько различных реализаций , которые вы можете использовать. Я оставлю это вам, чтобы сделать небольшую работу и определить, какие из них лучше всего использовать. Подсказка - проверьте JavaDocs для реализации классов List.

Как только у вас есть полный List со всеми четными числами, это довольно тривиальное упражнение для преобразования этого обратно в массив с помощью метода toArray. Опять же, я оставлю это вам, чтобы сделать небольшую работу, чтобы найти примеры того, как использовать метод. Подсказка. В StackOverflow есть несколько сообщений, которые его используют.

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

В качестве окончательного предложения вместо использования цикла с индексом для цикла в вашем полном массиве вы можете использовать Java 5+ для каждого расширенного синтаксиса цикла и упростить ваши потребности в индексировании. Пример:

for(int value : input){ 
    if(value % 2 == 0) 
    // do something 
} 

Это устранит хотя бы один запутанный индекс. Как забавное упражнение, посмотрите, можете ли вы закодировать свою функцию, не требуя каких-либо индексов цикла, используя некоторые из предложений, которые я сделал выше.

Если есть что-то непонятное, сообщите мне.

Смежные вопросы