我一直在做大量的编程挑战,并且最近遇到了这个问题:如何从数组中删除值然后缩小数组?我知道如何使用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;
}
答案 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;
}