deque.java

来自「java 的源代码」· Java 代码 · 共 760 行 · 第 1/2 页

JAVA
760
字号
package com.reddragon2046.base.utilities.data;

import java.util.*;

// Referenced classes of package com.reddragon2046.base.utilities.data:
//            AbstractSequence, DequeIterator, InputIterator, BidirectionalIterator,
//            Algos, ForwardIterator

public class Deque extends AbstractSequence
{

    public Deque()
    {
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
    }

    public Deque(int size)
    {
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
        insert(myStart, size, null);
    }

    public Deque(int size, Object object)
    {
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
        insert(myStart, size, object);
    }

    public Deque(Collection c)
    {
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
        addAll(c);
    }

    public Deque(Deque copy)
    {
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
        addAll(copy);
    }

    public void copy(Deque copy)
    {
        clear();
        addAll(copy);
    }

    public Object clone()
    {
        return new Deque(this);
    }

    public String toString()
    {
        return Algos.toString(this, "ListDeque");
    }

    public int size()
    {
        return myLength;
    }

    public void clear()
    {
        myMap = null;
        myStart = new DequeIterator(this, 0, 0);
        myFinish = new DequeIterator(this, 0, 0);
        myLength = 0;
    }

    public DequeIterator begin()
    {
        return new DequeIterator(myStart);
    }

    public ForwardIterator start()
    {
        return begin();
    }

    public DequeIterator end()
    {
        return new DequeIterator(myFinish);
    }

    public ForwardIterator finish()
    {
        return end();
    }

    public ListIterator listIterator()
    {
        return begin();
    }

    public ListIterator listIterator(int index)
    {
        BidirectionalIterator begin = begin();
        begin.advance(index);
        return begin;
    }

    public void add(int index, Object object)
    {
        ListIterator iter = listIterator(index);
        iter.next();
        iter.set(object);
    }

    public boolean contains(Object object)
    {
        return indexOf(object, myStart, myFinish) != -1;
    }

    public boolean remove(Object object)
    {
        return remove(object, 1) == 1;
    }

    public int removeRange(InputIterator first, InputIterator last)
    {
        if(!(first instanceof DequeIterator) || !(last instanceof DequeIterator))
            throw new IllegalArgumentException("Iterator not a DequeIterator");
        DequeIterator begin = (DequeIterator)first;
        DequeIterator end = (DequeIterator)last;
        if(begin.myDeque != this || end.myDeque != this)
            throw new IllegalArgumentException("Iterator not for this ListDeque");
        int n = begin.distance(end);
        int count = n;
        if(end.distance(myFinish) > myStart.distance(begin))
        {
            copyBackward(myStart, begin, end);
            while(n-- > 0)
                popFront();
        } else
        {
            copy(end, myFinish, begin);
            while(n-- > 0)
                popBack();
        }
        return count;
    }



    private int remove(Iterator first, Iterator last)
    {
        if((first instanceof InputIterator) && (last instanceof InputIterator))
            return removeRange((InputIterator)first, (InputIterator)last);
        else
            throw new IllegalArgumentException("Iterator not for this container");
    }

    public Object get(int index)
    {
        checkIndex(index);
        int blockIndex = myStart.myBlock + index;
        int mapIndex = myStart.myMap;
        if(blockIndex >= 128)
        {
            int jump = blockIndex / 128;
            mapIndex += jump;
            blockIndex %= 128;
        } else
        if(blockIndex < 0)
        {
            int jump = (127 - blockIndex) / 128;
            mapIndex -= jump;
            blockIndex += jump * 128;
        }
        return myMap[mapIndex][blockIndex];
    }

    public int indexOf(Object object)
    {
        return indexOf(object, ((BidirectionalIterator) (myStart)), ((BidirectionalIterator) (myFinish)));
    }

    public int indexOf(Object object, int index)
    {
        checkIndex(index);
        return indexOf(object, ((BidirectionalIterator) (myStart.copy(index))), ((BidirectionalIterator) (myFinish)));
    }

    public int indexOf(Object object, int first, int last)
    {
        if(last < first)
        {
            return -1;
        } else
        {
            checkRange(first, last);
            DequeIterator end = myStart.copy(last + 1);
            return indexOf(object, ((BidirectionalIterator) (myStart.copy(first))), ((BidirectionalIterator) (end)));
        }
    }

    public int lastIndexOf(Object object)
    {
        return lastIndexOf(object, ((BidirectionalIterator) (begin())), ((BidirectionalIterator) (end())));
    }

    public int lastIndexOf(Object object, int index)
    {
        checkIndex(index);
        return lastIndexOf(object, ((BidirectionalIterator) (myStart.copy(index))), ((BidirectionalIterator) (end())));
    }

    public int lastIndexOf(Object object, int first, int last)
    {
        if(last < first)
        {
            return 0;
        } else
        {
            checkRange(first, last);
            DequeIterator end = myStart.copy(last + 1);
            return lastIndexOf(object, ((BidirectionalIterator) (myStart.copy(first))), ((BidirectionalIterator) (end)));
        }
    }

    public Object remove(int index)
    {
        checkIndex(index);
        return removeFrom(myStart.copy(index));
    }

    public void removeRange(int first, int last)
    {
        if(last < first)
        {
            return;
        } else
        {
            checkRange(first, last);
            remove(myStart.copy(first), myStart.copy(last + 1));
            return;
        }
    }

    public Object set(int index, Object object)
    {
        checkIndex(index);
        int blockIndex = myStart.myBlock + index;
        int mapIndex = myStart.myMap;
        if(blockIndex >= 128)
        {
            int jump = blockIndex / 128;
            mapIndex += jump;
            blockIndex %= 128;
        } else
        if(blockIndex < 0)
        {
            int jump = (127 - blockIndex) / 128;
            mapIndex -= jump;
            blockIndex += jump * 128;
        }
        Object old = myMap[mapIndex][blockIndex];
        myMap[mapIndex][blockIndex] = object;
        return old;
    }

    public boolean containsAll(Collection c)
    {
        return this != c ? super.containsAll(c) : true;
    }

    public boolean addAll(Collection c)
    {
        return this != c ? super.addAll(c) : false;
    }

    public boolean addAll(int index, Collection c)
    {
        if(this != c)
            return super.addAll(index, c);
        if(myLength == 0)
        {
            return false;
        } else
        {
            super.addAll(index, new Deque(c));
            return true;
        }
    }

    public boolean removeAll(Collection c)
    {
        if(this == c)
        {
            clear();
            return true;
        } else
        {
            return super.removeAll(c);
        }
    }

    public boolean retainAll(Collection c)
    {
        return this != c ? super.retainAll(c) : false;
    }

    public void copy(Collection c)
    {
        if(this == c)
            return;
        if(c instanceof Deque)
        {
            Deque deque = (Deque)c;
            if(myLength >= deque.myLength)
            {
                DequeIterator begin = copy(((BidirectionalIterator) (deque.myStart)), ((BidirectionalIterator) (deque.myFinish)), myStart);
                remove(begin, myFinish);
            } else
            {
                DequeIterator end = deque.myStart.copy(myLength);
                copy(((BidirectionalIterator) (deque.myStart)), ((BidirectionalIterator) (end)), myStart);
                for(DequeIterator iter = end; iter.hasNext(); iter.advance())
                    add(iter.get());

            }
        } else
        {
            clear();
            super.addAll(c);
        }
    }

    public DequeIterator insert(DequeIterator pos, Object value)
    {
        if(pos.myDeque != this)
            throw new IllegalArgumentException("Iterator not for this ListDeque");
        if(pos.equals(myStart))
        {
            pushFront(value);
            return new DequeIterator(myStart);
        }
        if(pos.equals(myFinish))
        {
            pushBack(value);
            return myFinish.copy(-1);
        }
        int index = myStart.distance(pos);
        if(pos.distance(myFinish) > index)
        {
            pushFront(myStart.get());
            copy(myStart.copy(2), myStart.copy(index + 1), myStart.copy(1));
            DequeIterator i = myStart.copy(index);
            i.put(value);
            return i;
        } else
        {
            DequeIterator i2 = myFinish.copy(-1);
            pushBack(i2.get());
            DequeIterator i = myStart.copy(index);
            copyBackward(i, myFinish.copy(-2), myFinish.copy(-1));
            i.put(value);
            return i;
        }
    }

    public void insert(DequeIterator pos, int n, Object value)
    {
        if(n < 0)
            throw new IllegalArgumentException("Attempt to insert a negative number of objects");
        if(pos.myDeque != this)
            throw new IllegalArgumentException("Iterator not for this ListDeque");
        if(n == 0)
            return;
        int left = myStart.distance(pos);
        int right = pos.distance(myFinish);
        if(right > left)
        {
            if(n > left)
            {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?