我们知道,数组的内存要求是连续的。这就导致一个数组定义好之后之后就不能再修改长度。我们希望定义一个新的类,通过这个类实现数组使用意义上的长度改变。
我们的目标是创建一个新的类,可以通过这个类来定义数组,并且实现数组的add,get,remove,set方法。
这里出现的类只考虑了实现,并没有考虑实现的时间复杂度等问题。
名词解释
add:在数组的后面增加新的元素或数组数组
get:查找元素出现的位置(第一次出现的、最后一次出现的、所有下标)或是查找下标对应的元素
remove:删去某一个位置的元素并将后面的元素前移(不留空位)
set:实现元素替换:根据下标替换或根据元素替换(根据元素替换可能需要替换多个)
需要提前定义好的变量
数组允许的最大长度 maxlength
数组允许的最小长度 minlength
数组已经存的元素个数 size(注意这个变量的大小当然不等于length)
提前定义一个空数组 emptyArray
我们自己的数组 elementArray
建议提前写好以减少重复代码的方法
check方法:输入变量为一个整数i,若i大于等于0且i小于size,则结束,否则报错
报错语句为 throw new Illegal~~~~
copy方法:输入变量为一个老数组,一个新数组。check一下老数组的长度是否小于等于新数组。用for循环讲老数组的元素依次放到新数组里
数组定义
数组定义有三个初始化方法
1没有输入参数,这时候我们自己定义数组及其长度,建议定义为一个空数组。
2输入参数为数组长度,这时候我们根据输入长度来定义数组
3输入参数为数组,这时候将输入数组的内容传给我们自己的数组
add方法:
add方法分为两种,一种为只加入一个元素,一种为加入一个数组(都是在数组地末尾)
对于只加入一个元素的情况:
首先判断数组长度在add之后是否会超出已定义数组的长度,即size是否小于length。没超过的话直接令Strings[size]=对应的元素。
超过的话:定义一个新的长度更长的空数组(length+length>>1)(记为newArray)
调用copy方法,elementArray为老数组,newArray为新数组。然后将需要加的元素加到数组最后。
elementArray = newArray;这一步的作用是把新数组的地址传为elementArray变量。
对于加入数组的情况:
重复调用只加入一个元素的方法
get方法:
如果要根据下标查找,输入下标位置,输出相应的元素。记得check下标是否合法。
如果要查找元素出现的所有位置:定义一个新数组ints[],其中元素全为整数,其长度与elementArray相等,用于记录出现元素的下标。定义一个常数count,用于记录被查找元素出现了几次,初值为0。
对elementArray进行遍历,每出现一个要查找的元素,把他的下标传给ints[count]。
遍历完成之后定义一个新的数组newints[],长度为count。调用copy方法把ints复制给newints,这一步的目的是对ints[]进行截尾(去掉后面的null)
输入newints
如果要查找出现的第一个位置:定义一个变量用于记录这个位置,初值为-1。对elementArray进行遍历,出现被查找的元素就把这个元素的下标赋值给定义的变量,并break循环
如果要查找出现的最后一个位置:思路与查找第一个相同,只是循环由从0开始每次加一变成从size-1开始每次减一。
remove方法:
根据元素删除:对数组进行遍历,如果出现对应的元素,就令后续的元素迁移k个位置,k为已经删除元素的数量
根据下标删除。判断输入下标是否合法。删除元素前的部分迁移,后的部分作为i+1输入到新数组里
set方法:
和get的思路一样,查询完成之后替换一下就行