Python实现动态数组


DEFAULT_CAPACITY = 5
ELEMENTS_NOT_FOUND = -1


class ArrayList:
    __size = 0

    def __init__(self, capacity=DEFAULT_CAPACITY):
        capacity = DEFAULT_CAPACITY if capacity < DEFAULT_CAPACITY else capacity
        self.__elements = [None] * capacity

    def size(self) -> int:
        return self.__size

    def is_empty(self) -> bool:
        return self.size == 0

    def contains(self, element: int) -> bool:
        return self.__index_of__(element) != ELEMENTS_NOT_FOUND

    def add(self, element: int):
        self.insert(index=self.__size, element=element)

    def get(self, index: int) -> int:
        self.__range_check__(index)
        return self.__elements[index]

    '''
    用新的element替换角标为index的元素
    '''
    def set(self, index: int, element: int) -> int:
        self.__range_check__(index)
        self.__elements[index] = element
        return 0

    # 插入
    def insert(self, index: int, element: int):
        self.__range_check_for_add__(index)

        self.__ensure_capacity__(self.__size + 1)

        for i in range(self.__size, index, -1):
            self.__elements[i] = self.__elements[i-1]
        self.__elements[index] = element
        self.__size += 1

    def remove(self, index: int):
        self.__range_check__(index)

        for i in range(index, self.__size - 1):
            self.__elements[i] = self.__elements[i+1]
        self.__size -= 1

    def clear(self):
        self.__size = 0

    def __ensure_capacity__(self, capacity: int):
        old_capacity = len(self.__elements)
        if old_capacity >= capacity:
            return
        new_capacity = old_capacity + (old_capacity >> 1)
        new_elements = [None] * new_capacity
        for i in range(self.__size):
            new_elements[i] = self.__elements[i]
        self.__elements = new_elements

        print('%d扩容成%d' % (old_capacity, new_capacity))

    def __index_of__(self, element: int) -> int:
        for (index, element) in enumerate(self.__elements):
            if element == element:
                return index
        return ELEMENTS_NOT_FOUND

    '''
    检查下标值
    '''
    def __range_check__(self, index: int):
        if index < 0 or index >= self.__size:
            self.__out_of_bounds__()

    '''
    添加元素时, 检查下标值
    可以等于size 等于size时表示加到最后
    '''
    def __range_check_for_add__(self, index: int):
        if index < 0 or index > self.__size:
            self.__out_of_bounds__()

    def __out_of_bounds__(self):
        raise RuntimeError('out of bounds')

    def __str__(self):
        return str(self.__elements)

测试增删改查

arr = ArrayList()
arr.insert(0, 11)
arr.add(22)
arr.add(33)
arr.add(44)
arr.add(55)
print(arr)
print('-----------')

arr.insert(1, 66)
print(arr)
arr.remove(2)
print(arr)
arr.add(77)
print(arr)

print('-----------')

arr.clear()

print(arr)
arr.add(101)
arr.add(102)
print(arr)

测试扩容

arr = ArrayList()

arr.insert(0, 11)
arr.add(22)
arr.add(33)
arr.add(44)
arr.add(55)

for i in range(30):
    arr.add(i)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 0. 序言 数组是线性表的代表,是很多复杂数据结构的底层实现;对数组的特性认识越深刻,对学习和设计复杂的数据结构大...
    付凯强阅读 1,128评论 2 2
  • 目标:手动实现一个动态数组,模拟ArrayList ArrayList会自动扩容,先来看一下ArrayList扩容...
    坏淡一个阅读 2,111评论 0 1
  • 在学习Java时,学到的第一个数据结构就是数组。不过,JDK提供的数组是一个静态的,并不能很方便地进行增删改查等操...
    BlainPeng阅读 13,914评论 3 2
  • Java集合:ArrayList,Vector与Stack 本文非常详尽地介绍了Java中的三个集合类:Array...
    2Roc阅读 416评论 0 0
  • 初中的时候 学校停电,感叹,学校好low啊 高中的时候,有一次停电 感叹,太好啦,可以不上课了,一个比一个跑得快 ...
    涧译阅读 186评论 0 1