我必须编写自己的trimtoSize()方法来创建一个新数组

时间:2015-05-11 17:10:01

标签: java arrays

我已经提供了一个预先编写的程序,但有几种方法除外,其中一种方法是trimtoSize()。我知道它已经存在但是为此我必须自己编写。我必须这样做,所以在数组中有空的空间我必须使用相同的值创建一个新的数组,并使大小准确。我已经能够使用size()data.length来比较大小,但我不确定如何创建一个新的数组然后使用,因为该函数没有返回任何内容(它是无效的)。

这是我到目前为止所拥有的。

public void trimToSize(){

Array<Integer> temp = new Array<Integer>();

if(size() < data.length){
    int max = size();
    for(int i=0; i<size();i++){
        temp.add(data[i]);
    }
}}

正如我之前所说,我不知道如何返回temp,并且它将保持与之前相同的最大容量,因为它是使用构造函数创建的。有没有办法在不更改构造函数的情况下更改容量?

2 个答案:

答案 0 :(得分:0)

在没有看到其余代码的情况下我无法确定,但似乎这只是类的一部分,并且该类是一个名为data的Integer数组... 如果这个假设是真的,那么这应该有效..

public void trimToSize() {
    int size = 0;
    for(int i = 0; i < this.data.length; i++) {
        if(this.data[i] != null) {
            size++;
        }
    }
    Interger[] temp = new Interger[size];
    for(int i = 0, j = 0; i < this.data.length; i++) {
        if(this.data[i] != null) {
            temp[j] = this.data[i];
            j++;
        }
    }
    this.data = temp;
}

答案 1 :(得分:0)

以下是我从您的问题中理解的内容......您有一个不完整的预定义类,它模仿ArrayList的行为。您必须自己定义的一种行为是trimToSize()。根据{{​​3}}

enter image description here

这只是为了节省记忆。所以,我认为这是一门课程......

public static class MyArrayList {
    private Object[] array;
    private int capacity;
    private int size;
    private int index;

    public MyArrayList(int capacity) {
        this.capacity = capacity;
        array = new Object[capacity];

        index = 0;
    }

    public int size() {
        return size;
    }

    public int add(Object item) {
        if (index == capacity) {
            increaseSize();
        }

        array[index] = item;
        index++;
        size++;

        return index;
    }

    public Object get(int index) {
        if (0 <= index && index < size) {
            return array[index];
        } else {
            throw new IndexOutOfBoundsException();
        }
    }

    public void trimToSize() {
        if (size < capacity) {
            Object[] newArray = new Object[size];
            System.arraycopy(array, 0, newArray, 0, size);
            array = newArray;
            capacity = size;
        }
    }

    private void increaseSize() {
        capacity++;
        Object[] newArray = new Object[capacity];
        System.arraycopy(array, 0, newArray, 0, array.length);
        array = newArray;
    }
}

以下是此课程的用法:

public static void main(String[] args) throws Exception {
    MyArrayList myArrayList = new MyArrayList(5);
    myArrayList.add(1);
    myArrayList.add(2);
    myArrayList.add(3);

    for (int i = 0; i < myArrayList.size(); i++) {
        System.out.println(myArrayList.get(i));
    }

    myArrayList.trimToSize();
    myArrayList.add(4);
}

在实例化容量为5的MyArrayList之后,您会看到数组中有5个元素。其中三个分别具有值1,2和3,而后两个为空。

enter image description here

但是在trimToSize()调用之后,将从数组中删除两个空项。

enter image description here

然后,当添加数字4时,容量会动态增加。

enter image description here

这绝对不是你为工作做的事情,而且对于基础编程课来说似乎是先进的,但是你有它。我只希望如果这是一堂课(我基本上已经完成了你的功课),你的导师就足以向你解释这种行为了。我之前曾是一名兼职教授,并且见过许多教授,IMO在解释编程理论和将概念应用于代码时非常糟糕。

更新

在查看您的个人资料后,我发现您从未接受任何人的回答,这完全浪费了其他时间来帮助您。