Подтвердить что ты не робот

Удалить элемент из массива и массива сокращения

Как я могу удалить элемент из массива, а затем изменить размер массива на меньший размер? Аналогично, как я могу увеличить емкость, если мне нужно добавить другой элемент?

4b9b3361

Ответ 1

Размер массива Java фиксируется при его распределении и не может быть изменен.

  • Если вы хотите "вырастить" или "сжать" существующий массив, вам нужно выделить новый массив соответствующего размера и скопировать элементы массива; например используя System.arraycopy(...) или Arrays.copyOf(...). Цикл копирования работает также, хотя он выглядит немного неуклюжим... IMO.

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

Существуют альтернативы в виде сторонних библиотек (например, Apache Commons ArrayUtils), но вы можете подумать, стоит ли добавлять зависимость библиотеки только ради метода, который вы могли бы реализовать с помощью 5-10 строк кода.


Лучше (т.е. проще... и во многих случаях более эффективный 1) использовать класс List вместо массива. Это позаботится о том, чтобы (по крайней мере) выращивать хранилище резервных копий. И есть операции, которые заботятся о вставке и удалении элементов в любом месте списка.

Например, класс ArrayList использует массив как резервную копию и автоматически увеличивает массив по мере необходимости. Он не автоматически уменьшает размер массива поддержки, но вы можете сказать, что это нужно сделать с помощью метода trimToSize(); например.

ArrayList l = ...
l.remove(21);
l.trimToSize();  // Only do this if you really have to.

1 - я говорю, что он "более эффективен во многих случаях", потому что ArrayList использует простую стратегию "двойного размера", когда ему нужно вырастить массив поддержки. Это означает, что если вы увеличиваете список, добавляя к нему несколько раз, каждый элемент будет скопирован в среднем за одно дополнительное время. В отличие от этого, если вы сделали это с помощью массива, вы в конечном итоге скопировали бы каждый элемент массива в среднем на N/2 раза.

Ответ 2

Вы не можете изменять размер массива как таковой, но вы можете создать новый массив и эффективно скопировать элементы из старого массива в новый массив, используя некоторую служебную функцию следующим образом:

public static int[] removeElement(int[] original, int element){
    int[] n = new int[original.length - 1];
    System.arraycopy(original, 0, n, 0, element );
    System.arraycopy(original, element+1, n, element, original.length - element-1);
    return n;
}

Однако лучшим подходом было бы использование ArrayList (или аналогичной структуры List) для хранения ваших данных, а затем использовать его методы для удаления элементов по мере необходимости.

Ответ 3

Использование ArrayUtils.removeElement(Object[],Object) из org.apache.commons.lang - самый простой способ сделать это.

int[] numbers = {1,2,3,4,5,6,7};
//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1);

Ответ 4

Я создал эту функцию или класс. Im kinda new, но мой друг тоже нуждался в этом, поэтому я создал это:

public String[] name(int index, String[] z ){
    if(index > z.length){
        return z;
    } else {
        String[] returnThis = new String[z.length - 1];
        int newIndex = 0;
        for(int i = 0; i < z.length; i++){
            if(i != index){
                returnThis[newIndex] = z[i];
                newIndex++;
            }
        }
        return returnThis; 
    }
}

С его симпатичным revelant, я думал, что я разместил его здесь.

Ответ 5

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

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

int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);

После запуска вышеуказанного кода a теперь укажет на новый массив, содержащий только 1, 2.

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

Этот подход неэффективен. Если вам нужно управлять измененным списком элементов в памяти, лучше используйте List. В частности, LinkedList удалит элемент из списка в O(1) (максимально возможное теоретически).

Ответ 6

object[] newarray = new object[oldarray.Length-1];

for(int x=0; x < array.Length; x++)
{
  if(!(array[x] == value_of_array_to_delete))
  // if(!(x == array_index_to_delete))
   {
     newarray[x] = oldarray[x];
   }
}

Нет способа уменьшить размер массива после его создания, но вы можете скопировать содержимое в другой массив меньшего размера.

Ответ 7

Массивы фиксированы по размеру, вы не можете изменять их размер после их создания. Вы можете удалить существующий элемент, установив его на null:

objects[4] = null;

Но вы не сможете удалить весь этот слот из массива и уменьшить его размер на 1.

Если вам нужен массив с динамическим размером, вы можете использовать ArrayList. С его помощью вы можете add() и remove() объектов, и он будет расти и сокращаться по мере необходимости.

Ответ 8

без использования метода System.arraycopy вы можете удалить элемент из массива со следующими

    int i = 0;
    int x = 0;
    while(i < oldArray.length){
        if(oldArray[i] == 3)i++;

        intArray[x] = oldArray[i];
        i++;
        x++;
    }

где 3 - значение, которое вы хотите удалить.

Ответ 9

Вы всегда можете расширить массив, просто увеличив его размер при создании массива, или вы также можете изменить размер после создания, но уменьшить или удалить элементы. Альтернативное решение без создания нового массива возможно:

package sample;

public class Delete {
    int i;
    int h=0;
    int n=10;
    int[] a;
    public Delete()
    {
    a = new int[10];
    a[0]=-1; 
    a[1]=-1; 
    a[2]=-1;
    a[3]=10;
    a[4]=20;
    a[5]=30;
    a[6]=40;
    a[7]=50;
    a[8]=60;
    a[9]=70;
    }
    public void shrinkArray()
    {
    for(i=0;i<n;i++)
            {
                if(a[i]==-1)
                    h++;
                else 
                    break;
            }
            while(h>0)
                {
                    for(i=h;i<n;i++)
                    {
                        a[i-1]=a[i];
                    }
                    h--;
                    n--;
                }
            System.out.println(n);
    }
    public void display()
    {
        for(i=0;i<n;i++)
        {
            System.out.println(a[i]);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Delete obj = new Delete();
        obj.shrinkArray();
        obj.display();

    }

}

Прокомментируйте любые ошибки!

Ответ 10

Не использовать какую-либо предварительно определенную функцию, а также эффективную: --- →

public static void Delete(int d , int[] array )
{       
    Scanner in = new Scanner (System.in);

    int i , size = array.length;

    System.out.println("ENTER THE VALUE TO DELETE? ");

     d = in.nextInt();

        for ( i=0;i< size;i++)
        {
                if (array[i] == d)
                        {


                            int[] arr3 =new int[size-1];
                            int[] arr4 = new int[i];
                            int[] arr5 = new int[size-i-1];

                                    for (int a =0 ;a<i;a++)
                                    {
                                        arr4[a]=array[a];
                                        arr3[a] = arr4[a];
                                    }
                                     for (int a =i ;a<size-1;a++)
                                     {
                                         arr5[a-i] = array[a+1];
                                         arr3[a] = arr5[a-i];

                                     }


                System.out.println(Arrays.toString(arr3));

                        }
                else System.out.println("************");    


        }

}