数据结构:ArrayList与顺序表

数据结构:ArrayList与顺序表

1:基本概念:线性表的理解可以先从数组上手,因为后续方法就是用数组来实现的。

2:先创建一个MyArrayList的类,<E>是Java的泛型机制,可以指定具体的类型。

定义一个整形数组array,定义一个已占用的数组长度usedSize,再定义一个静态常量default_size,赋值为10。

java.util.ArrayList:是java包中的一个类,用于实现动态数组的功能。

再调用不带参数的构造方法,初始化一个整形数组,数组长度为default_size。

最后调用带参数的构造方法,将新创建的ArrayList对象赋值给list,并指定容量大小为intitalCapacity。

3: add方法:默认在数组最后添加元素。

调用add方法时要先调用isFull方法,判断数组是否满了。如果返回true代表数组满了,就要调用copyOf方法将数组长度扩容为2倍。

然后将usedSize位置赋值为data,usedSize加1

  

4:display方法:遍历数组

调用for循环,一个一个打印数组的元素,加空格,最后换行。

在测试类main方法调试:

打印结果:

5: add方法:在数组指定位置添加元素

先判断pos是否小于0或者大于usedSize,如果不是就打印“位置不合法”,结束程序。

再调用isFull方法判断数组是否满了,如果满了就调用copyOf方法扩容数组长度。

最后调用for循环,从usedSize位置开始,到pos位置结束,把前一个元素赋值给后一个,这样就把pos位置空出来了。循环结束后把pos位置赋值为data,最后usedSize++。

6:indexOf方法:查找某个元素对应的位置or下标

通过for循环遍历数组,如果某个下标对应的元素等于data,就返回下标i,如果没有就返回-1

7:contains方法:判断是否包含某个元素

通过for循环遍历数组,如果有i下标对应的值等于data,就返回true,没有就返回fasle

8:get方法:获取pos位置的元素

先判断pos是否小于0或大于等于usedSize,如果是则打印错误,返回-1

如果不是就返回pos位置的元素。

 

9: set方法:将pos位置的元素设为data

先判断pos是否小于0或大于等于usedSize,如果是就打印错误。

不是就将pos位置的元素设为data。

10:remove方法:删除第一次出现的关键词toRemove

先调用indexOf把toRemove的下标赋给index,如果index等于-1则打印错误。

接着调用for循环,从index位置开始,将后一个位置的元素赋值给前一个,直到数组最后一个,最后将数组长度减一。

11:size方法:求数组已有元素的个数

直接返回usedSize。

 12:clear方法:清空数组

注意:基本数据类型不能置为null,直接将数组长度设为0

 13:ArrayList的构造

(1)无参构造(myArrayList1):会自动分配大小为10的内存,不够按照1.5倍扩容。

(2)指定容量(myArrayList2):指定了大小为20的内存。

(3)利用其他collection构建arraylist(myArraylist3):将myArrayList2中的元素也存储到了myArrayList3中。

输出结果:

14: 三种遍历方式

(1):使用下标+for循环遍历

(2):foreach遍历

(3):Iterator遍历

输出结果:

15:杨辉三角

本质上是一个二维数组,每一行除了首末元素之外,其他的元素都是上一行的同列和前列位置的元素之和。

每行首末元素均为1

举例:curRow为第四行,prevRow为第三行,第四行第三个元素“3”等于第三行第二个元素“2”加上第三行第三个元素“1”。

给出一个generate方法,创建杨辉三角,number是赋值的具体行数。 

先创建一个LIst<List<Integer>>类型的二维数组 row,再创建一个一维数组rew,先给rew添加第一个元素,只有一个1,再把rew添加到row中。

从第二行开始for循环,创建一个当前行curRow,因为每个第一个元素和最后一个元素永远都是1,先用add方法加1。

再创建一个相对于curRow的上一行prevRow,通过row调用get方法。

再从第二列开始for循环,每个元素都是上一行的同列和前一列元素之和,然后加到curRow中,直到每一行倒数第二个元素。

计算完每一行中倒数第二个元素,跳出第二个循环,调用add方法添加每一行的最后一个1,再将curRow添加到二维数组row中。

再开始下一行一维数组的计算。

全部计算完以后,调用printPascalTriangle方法,实现换行操作,最终返回row。

通过嵌套两个foreach循环,实现每打印一个一维数组就换行。

在main方法中调用generate方法,并将参数值赋值为5

 

输出结果:

16: 巧用contains方法破解面试题

把“welcome to cvte”中包含“cvte”四个字母的字母全部去除并输出最终结果。

定义了一个func方法,给了两个参数str1和str2,然后创建了一个接收char类型的list。

通过for循环和charAt方法,将str1的每个字母转成字符赋值给ch,接着ch+一个“”变成字符串,然后通过contains方法,如果ch不包含在str2中,就加到list中,直到结束循环,返回list。

main方法中,创建一个list并调用func方法,赋值给ret,再通过foreach循环,输出最终结果。

输出结果:

17:洗牌游戏 

创建一个Card类,分别定义花色color和牌面值rank,给出一个toString方法、带参数的构造方法用于初始化color和rank,和不带参数的构造方法。

(1)再创建一个BuyCard类,用于生成牌和洗牌。

(2)先定义一个string类数组suit,定义四种花色。

(3)再给出一个返回值类型为ArrayList<Card>的Buy方法,创建一个ArrayList类型的list,然后套用两个for循环,给每种花色生成13张牌,添加到list中,最后返回list。

 

定义了一个shuffle方法,用于将牌打乱顺序。

for循环从list最后一个元素开始,到第二个元素为止,不断生成0到i的随机数,然后调用swap方法。

再定义了一个private方法,在shuffle中调用,用于交换两张牌。先将i位置的牌赋值给tmp,再将j位置的牌放到i位置,最后将tmp也就是原本i位置的牌放到i位置,实现了打乱牌的顺序。 

 

最后在main方法中,调用Buy方法并通过deck打印原本有顺序的牌。

再调用shuffle方法,打印打乱顺序后的牌 。

 

打印结果:

 

18:关于ArrayList的思考:本质上是用数组的思维解决实际问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值