从头开始创建数组列表

时间:2016-03-08 23:30:34

标签: java arrays list

我想知道是否有人能够指出我在创建自己的数组列表方法方面的正确方向。例如,我指定的当前项目不允许我免费使用给我的方法,如下例所示。

    package com.tutorialspoint;

import java.util.ArrayList;

public class ArrayListDemo {
   public static void main(String[] args) {

   // create an empty array list with an initial capacity
   ArrayList<Integer> arrlist = new ArrayList<Integer>(5);

   // use add() method to add elements in the list
   arrlist.add(15);
   arrlist.add(22);
   arrlist.add(30);
   arrlist.add(40);

   // adding element 25 at third position
   arrlist.add(2,25);

   // let us print all the elements available in list
   for (Integer number : arrlist) {
   System.out.println("Number = " + number);
   }  
   }
}   

此示例显示add()方法。对于我的项目,我必须自己创建这个方法,并从我的包中的不同文件中调用它。

3 个答案:

答案 0 :(得分:1)

这很容易理解;但是,我在评论中解释了一下。

public class MyArrayList<E extends Object> {


    private static int initialCapacity = 5;
    private static int currentSize;
    private Object[] myArrayList = {}, temp = {};

    private static int currentIndex = 0;

    public static void main(String[] args) {
        MyArrayList arrList = new MyArrayList();
        arrList.add("123"); //add String
        arrList.printAllElements();
        arrList.add(new Integer(111)); //add Integer
        arrList.printAllElements();

        arrList.add(new Float("34.56")); //add Integer
        arrList.printAllElements();

        arrList.delete("123");
        arrList.printAllElements();

        arrList.delete(123);
        arrList.printAllElements();
        arrList.delete(123);

        arrList.printAllElements();

    }

    public MyArrayList() {  //creates default sized Array of Objects
        myArrayList = new Object[initialCapacity]; //generic expression

        /* everytime I cross my capacity, 
    I make double size of Object Array, copy all the elements from past myObject Array Object
         */
    }

    public MyArrayList(int size) { //creates custom sized Array of Objects
        myArrayList = new Object[size];
    }

    public void add(Object anyObj) {
        //add element directy
        myArrayList[currentIndex] = anyObj;
        currentSize = myArrayList.length;
        currentIndex++;
        if (currentIndex == currentSize) {
            createDoubleSizedObjectArray(currentSize);
        }
    }

    //print all elements
    public void printAllElements() {
        System.out.println("Displaying list : ");
        for (int i = 0; i < currentIndex; i++) {
            System.out.println(myArrayList[i].toString()); 
        }
    }

    private void createDoubleSizedObjectArray(int currentSize) {
        temp = myArrayList.clone();
        myArrayList = new MyArrayList[2 * currentSize];  //myObject pointer big size data structure

//         myObject = temp.clone(); //probably I can do this here as well. Need to check this
        System.arraycopy(temp, 0, myArrayList, 0, currentSize);

    }

    void delete(Object object) {
        //if already empty 
        if (currentIndex == 0) {
            System.out.println("Already empty!");
            return;
        }
        //you don't need to delete anything. I can simply override the storage
        currentIndex--;
    }
}

答案 1 :(得分:0)

import java.util.ArrayList;

public class MyArrayList<E> extends ArrayList<E>{

    private static final long serialVersionUID = -5164702379587769464L;

    public void newMethod(){
        // No implementation
    }

}

这是一个从ArrayList扩展的类,一个名为newMethod()的方法被添加到这个类中。

下面我们在你的情况下调用这个新创建的方法,你必须实现对这个新创建的方法的添加。

public class Hello {

    public static void main(String args[]) {

        MyArrayList<Integer> myList = new MyArrayList<Integer>();

        // It has the ArrayList add() method as this new class extends from ArrayList (all the ArrayList methods are included)
        myList.add(2);

        // The newly created method in your case you need to implement the add yourself
        myList.newMethod();
    }
}

这也可能是您需要的一个很好的链接。

http://www.java2novice.com/java-interview-programs/arraylist-implementation/

我还建议您首先尝试实施并解决您的问题,然后询问有关特定问题的问题,并且只有在您对可能导致此问题的原因进行了很好的研究之后(还有很多资源)。如果你在提出这个问题之前做了一些研究,我很确定你能够自己解决所有问题。

希望您发现此信息有用。祝好运。

答案 2 :(得分:-1)

我发现这是一个有趣的问题。我一直很好奇事情如何在原始水平上发挥作用。

如果您考虑一下,ArrayList基本上只是一个可以展开的数组。所以你可以有一个非常大的数组(这会占用一个ArrayList的大量内存)或者每次你添加一些东西时,你创建一个新的更大的数组并复制内容并添加新项目(我认为性能是O(N))。

这是我不使用任何库的尝试:

public class MyArrayList<T>
{
    private T[] asArray;

    @SuppressWarnings("unchecked")
    public MyArrayList()
    {
        asArray = (T[]) new Object[0];
    }

    public void add(T t)
    {
        @SuppressWarnings("unchecked")
        T[] temp = (T[]) new Object[asArray.length + 1];

        // copy everything over to the new array
        for (int i = 0; i < asArray.length; i++)
        {
            temp[i] = asArray[i];
        }

        // add the new element
        temp[asArray.length] = t;
        asArray = temp;
    }

    public void remove(int index)
    {
        if (index < 0 || index >= asArray.length) return;
        @SuppressWarnings("unchecked")
        T[] temp = (T[]) new Object[asArray.length - 1];

        boolean found = false;
        // copy everything over to the new element
        for (int i = 0; i < asArray.length; i++)
        {
            // don't copy if the indices are the same
            if (i == index)
            {
                found = true;
                continue;
            }
            temp[i - (found ? 1 : 0)] = asArray[i]; // it's i - 1 after the removed object so then it doesn't leave a gap and it doesn't go over the array's length
        }
        asArray = temp;
    }

    public T get(int index)
    {
        return asArray[index];
    }
}

我为这段代码感到自豪。 :)我认为Short_Teeth的代码作弊,因为该类是一个子类,并且,好吧,不添加任何东西。我希望我能帮忙。