数据结构: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的思考:本质上是用数组的思维解决实际问题。