package fuxi;
/**
* @auther 张弢
* @create 2022-12-05 10:59
*/
public class ArrayList_12_5 {
int[] arr=null;
int DEFAULT_CAPACITY=3;//初始化数组长度
int count=0;//记录元素个数
public static void main(String[] args) {
ArrayList_12_5 arrayList_12_5=new ArrayList_12_5();
arrayList_12_5.init();
arrayList_12_5.add(100);
arrayList_12_5.add(102);
arrayList_12_5.add(102);
arrayList_12_5.traverse(arrayList_12_5.arr);
System.out.println("\n指定位置插入元素:");
arrayList_12_5.insert(0,99);
arrayList_12_5.insert(1,97);
arrayList_12_5.insert(2,97);
arrayList_12_5.traverse(arrayList_12_5.arr);
System.out.println("\n元素是否存在:"+arrayList_12_5.contains(99));
System.out.print("有效元素个数:"+arrayList_12_5.getSize());
System.out.println("判断数组是否为空:"+arrayList_12_5.isEmpty());
System.out.println("根据下标99查找元素:"+arrayList_12_5.search(1));
System.out.println("指定区间查找元素返回下标:"+arrayList_12_5.find(0,3,102));
arrayList_12_5.traverse(arrayList_12_5.arr);//排序前遍历
// System.out.print("\n冒泡排序:");
// arrayList_12_5.bubbleSort(arrayList_12_5.arr);
// arrayList_12_5.traverse(arrayList_12_5.arr);//排序后遍历
// System.out.println("有序数组区间二分法查找某值返回下标:"+arrayList_12_5.binarySearch(0,5,101));
// System.out.println("区间删除:");
// arrayList_12_5.delete(0,3);
System.out.println("\n无序列表去重:");
arrayList_12_5.deduplicate();//有Bug
arrayList_12_5.traverse(arrayList_12_5.arr);
// System.out.println("\n有序去重:");
// arrayList_12_5.unique3();
// arrayList_12_5.traverse(arrayList_12_5.arr);
}
//1.初始化
public void init(){
arr=new int[DEFAULT_CAPACITY];
}
//2.添加元素
public void add(int element){
arr[count++]=element;
}
//3.遍历
public void traverse(int[] arr){
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
//4.指定位置插入元素
public void insert(int index,int element){
if (index<0||index>count)return;
grow();
//移动元素
for (int i=count;i>index;i--){
arr[i]=arr[i-1];
}
arr[index]=element;
count++;
}
//5.扩容
private void grow() {
if (count<arr.length)return;
copyData(arr.length *2);
}
//6.复制数据
private void copyData(int length) {
int[]temp=arr;
arr=new int[length];
for (int i=0;i<count;i++){
arr[i]=temp[i];
}
temp=null;
}
//7.获取有效元素个数
public int getSize(){
return count;
}
//8.判断是否为空
public boolean isEmpty(){
return count==0;
}
//9.查找某元素是否存在
public boolean contains(int element){
for (int i=0;i<arr.length;i++){
if (arr[i]==element) return true;
}
return false;
}
//10.根据下标查找元素
public int search(int index){
if (index<0||index>=count) return -1;
return arr[index];
}
//11.指定区间查找元素,找到就返回元素的下标,否则返回-1
public int find(int start,int end,int element){
while (start<=end){
if (arr[end]==element) return end;
end--;
}
return -1;
}
//12.冒泡排序
public void bubbleSort(int[] arr){
for (int i=1;i<arr.length;i++){
for (int j=i-1;j<arr.length-i;j++){
if (arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
//13.区间二分查找某值
public int binarySearch(int start,int end,int element){
while (start <= end){
int mid=(start+end)/2;
if (element< arr[mid]) end=mid-1;
else if (arr[mid] < element) start=mid+1;
else return mid;
}
return -1;
}
//14.区间删除(区间左闭右开)
public void delete(int start,int end){
if (start>=end) return;
while (end<count) {
arr[start++]=arr[end];
arr[end]=0;
end++;
}
count=start;
int length=arr.length;
if ((length/count)>=2) copyData(length/2);//缩容
}
//15.根据指定位置删除元素
public void delete(int index){
delete(index,index+1);
count--;
}
//16.基于有序数组去重
/*public void unique1(){
for (int i=1;i<count;){
if (arr[i-1]==arr[i]) delete(i);
else i++;
}
}*/
//17.基于有序数组去重
public void unique2() {
int i = 0;
for (int j = 1; j < count; j++) {
//如果i位置的值与j位置的值不相等,则把j位置的值移动到i位置的下一个位置
if (arr[i] != arr[j]) arr[++i] = arr[j];
arr[j] = 0;//把垃圾数据置为0
}
count = ++i;
}
//18.基于有序数组去重
public void unique3(){
int i=0,j=0;
while (++j<count){
if (arr[i]!=arr[j]) arr[++i]=arr[j];
arr[j]=0;
}
count=++i;
}
//19.基于无序无数去重
public void deduplicate(){
int start=1;
while (start<count){
if (find(0,start-1,arr[start])==-1) start++;
else delete(start);
}
}
}
数组---实现各操作
于 2022-12-05 17:53:27 首次发布