如何从数组中删除值并收缩数组?

时间:2015-06-15 21:58:12

标签: java arrays

我一直在做大量的编程挑战,并且最近遇到了这个问题:如何从数组中删除值然后缩小数组?我知道如何使用Arraylist及其methods解决问题,但我想知道如何通过使用固定大小的基本数组从头开始解决问题。如果smb精心解释解决方案,我真的很感激。

public static int[] shrinkArray(int key)
{
    int[] resultArray = new int[myArray.length];
    for(int i = 0; i < myArray.length; i++)
    {
        if(myArray[i] == key)
           break;
    }

 return resultArray;
}

4 个答案:

答案 0 :(得分:2)

你几乎拥有它。

public static int[] shrinkArray(int key)
{
    int[] resultArray = new int[myArray.length-1]; //One length less as we removed an item
    boolean found = false;
    for(int i = 0, j = 0; i < myArray.length; i++, j++)
    {
        if(!found && myArray[i] == key){ //if we find item first time
            i++;                        //skip it
            found = true;               //we found first occurrence
        }
        if(j < resultArray.length)
            resultArray[j] = myArray[i]; //copy array
    }
    if(found)
        return resultArray;
    return myArray;  //not found
}

答案 1 :(得分:1)

也许将你的数组转换为arraylist然后使用arraylist类的remove()方法会有效。然后你可以把所谓的arraylist转换回一个数组。两种转换都可以使用for循环。

另一个选择是采用数组。找到要删除的值的索引。然后从该索引开始一个for循环,将所有值移到该索引的右边,然后将这些值放在左边一个索引。

答案 2 :(得分:0)

这是一个可调整的数组,可以在删除和添加操作时更改容量(达到容量时)。没试过这么多,但看起来还不错。

public class ArrayBackedIndexedCollection {

    private int size;
    private int capacity;
    private Object[] elements;

    public ArrayBackedIndexedCollection(){      

        this.capacity = 1;
        this.elements = new Object[capacity];
    }

    public ArrayBackedIndexedCollection(int initalCapacity){

        /***************************************************
         if initial capacity is less then 1 -> throw
         exception
         **************************************************/
        this.capacity = initalCapacity;
        this.elements = new Object[initalCapacity];

    }


    public int size(){

        return size;
    }

    public void add(Object object){

        // if capacity is reached
        if ( size == capacity){


            Object[] tmp = new Object[capacity];
            // backup current array
            System.arraycopy(elements, 0, tmp, 0, elements.length);

           // re size to double capacity 
            elements = new Object [2*capacity];

           // copy backup into re sized elements array
            System.arraycopy(tmp, 0, elements, 0, tmp.length);

            capacity = 2 * capacity;

        }

        this.elements[size] = object;
        size++;
    }

    public Object get(int index){

        return this.elements[index];    
    }

    public void remove(int index){

        elements[index] = null;
        size --;

        System.arraycopy(elements, index, elements, index + 1, size() - index);

    }

    public void insert(Object value, int position){

        //...
    }

}

答案 3 :(得分:0)

在java中创建数组对象后,无法调整其大小。如果你想要一个不同大小的数组,你将不得不创建一个新数组,然后从头开始填充它。

你可以想象这种效率非常低,性能也很重。最好使用ArrayList或LinkedList。作为一般规则,您应该支持集合而不是数组,但如果您只是想在这里解决挑战,那我该怎么做:

public static int[] shrinkArray(int keyToRemove, int[] arrayToRemoveFrom){
    int[] resultArray = new int[arrayToRemoveFrom.length - 1];//new array is one smaller
    boolean itemRemoved = false;
    for(int i = 0, j = 0; i < resultArray.length; i++, j++){
        if(!itemRemoved && arrayToRemoveFrom[i] == keyToRemove){
            itemRemoved = true;//boolean so you only get in here once
            i--;//decrease i for result array so you done leave a blank space 
        }else{
            resultArray[i] = arrayToRemoveFrom[j];
        }
    }
    return resultArray;
}