簡體   English   中英

列表接口實現

[英]List Interface implementation

我在 class 中創建了一個通用的 class,其工作方式類似於 ArrayList。class 包含一個數組,該數組會根據函數的需求變大或變小。 現在,我必須實現 List 接口並卡在 Iterator 和 ListIterator 上。 當我嘗試實現依賴於 Iterator 或 ListIterator 的方法時,我總是遇到錯誤。 當然,我已經在 inte.net 上進行了搜索,但我想我錯過了一些東西。

public class EviatarList 實現 List, Iterable {

private E[] arr;
private static final int DEFAULT_CAPACITY = 3;
private int index = 0;

private int iteratorIndex = 0;
@Override
public Iterator<E> iterator() {Iterator<E> it = new Iterator<E>() {
        @Override
        public boolean hasNext() {
            return index < arr.length && arr[index + 1] != null;
        }
        @Override
        public E next() {return arr[iteratorIndex++];}
        @Override
        public void remove(){
        E [] arr1 =(E[]) new Object [size()-1];
            try {
        arr[iteratorIndex] = null;
        iteratorIndex--;
        index--;
            for (int i = 0, j = 0; i < arr.length; i++, j++) {
                if (arr[i] != null)
                {
                    arr1[j] = arr[i];
                } else{
                    j--;
                }
            }
            } catch (Exception e)
            {
                System.out.println(e.getMessage());
            }
            arr = arr1;
        }
    };
    return it;
}
public ListIterator<E> listIterator() {
    ListIterator<E> li = new ListIterator<E>() {
        //o(1)
        @Override
        public boolean hasNext() {
            return index < arr.length;
        }

        //o(1)
        @Override
        public E next() {
            return arr[index++];
        }

        //o(1)
        @Override
        public boolean hasPrevious() {
            return index > 0;
        }

        //o(1)
        @Override
        public E previous() {
            return arr[index--];
        }

        //o(1)
        @Override
        public int nextIndex() {
            return iteratorIndex;
        }

        //o(1)
        @Override
        public int previousIndex() {
            return iteratorIndex--;
        }

        // o(n)
        @Override
        public void remove() {
            E[] newArr = (E[]) new Object[arr.length - 1];
            index--;
            for (int i = 0, j = 0; i < index; i++, j++) {
                if (i != iteratorIndex) {
                    newArr[i] = arr[j];
                } else {
                    j--;
                }
            }
            arr = newArr;
        }

對不起,但你的問題有點含糊,所以我無法真正回答。 EviatarList的實現未顯示但已使用(例如size() )並且“我一直只收到錯誤”不清楚錯誤的類型(來自使用它的編譯器或運行時,...)。

關於您的實施的一些想法可能有助於更進一步:

  • 為什么要實現自己的List而不是擴展AbstractList (這將提供隨時可用的迭代器)?
  • 您可以在同一個集合上有多個迭代器,因此iteratorIndex必須是Iterator的 state(也稱為成員),而不是List的!
  • 您的實現中對indexiteratorIndex存在一些混淆。 index有什么區別和作用是什么?
  • 由於ListIterator擴展Iterator它將簡化您對兩者使用相同的實現:
     public Iterator<E> iterator() { return listIterator(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM