01_数组
如何创建数组和如何使用数组使我们对数组的基本操作
package com.qr.tztz; /** * 数组: * * 面向对象: * 一切行为都是对象的 */ public class ArrayStudy { public static void main(String[] args) { //存放10个int类型的数据 int[] ints = new int[10]; //Integer[] intss = new Integer[10]; //设置值 ints[0] = 1; //获取值 //System.out.println(ints[0]); //数组的静态初始化,long Long[] longss = {Long.valueOf(6531443), Long.valueOf(431),Long.valueOf(6143543),Long.valueOf(3423)}; long[] longs = {3414,31,43,412,4312,34312,3,431,3,341}; //默认的构造方法创建 MyArray myArray = new MyArray(); myArray.insert(32); myArray.insert(322); myArray.insert(32333); myArray.insert(32333); myArray.insert(32333435); myArray.insert(21132333); myArray.showArr(); long l = myArray.searchData(32323); System.out.println(l); long l1 = myArray.searchData(322); System.out.println(l1); System.out.println("----------------------------------"); myArray.deleteIndex(2); myArray.showArr(); // myArray.deleteIndex(5); System.out.println("==================================="); myArray.deleteData(21132333); myArray.showArr(); System.out.println("----------------穷人---------------"); //修改32的值为132,方法有问题,索引越界. myArray.update(322,132); myArray.showArr(); System.out.println("----------------穷人---------------"); //直接传入索引进行修改 myArray.change(0,132); myArray.showArr(); } } /** * */ class MyArray{ //数组没有初始化之前的值为null private long[] arr; //表示有效数据有多少,int类型的初始化之前的类型为0 private int elements; public MyArray(){ //初始化数组的大小 arr = new long[20]; } //有参构造方法初始化数组 public MyArray(int maxSize){ arr = new long[maxSize]; } /* 添加数据 接收一个需要插入的数 */ public void insert(int value){ //首先数组的第一个元素为这个value arr[elements] = value; //然后这个elements进行累加 elements++; } /* 显示数组中的元素 */ public void showArr(){ System.out.print("["); for (int i = 0; i < arr.length; i++){ if (i == arr.length-1){ System.out.println(arr[i]+"]"); }else{ System.out.printf(arr[i]+", "); } } } /* 查找数据 根据指定的值来进行查找 */ public int searchData(long value){ //根据值进行查询 int i; for (i = 0; i < elements; i++) { if(value == arr[i]){ break; } } //遍历完还没找到 if (i == elements){ System.out.println("数据查找不到"); //就是没有查找到 return -1; }else { // return i; } } /* 根据索引来进行查找 */ public long searchIndex(int index){ if(index<0 || index >= arr.length){ //抛出异常需要new,这个千万不要犯错,丢人 throw new ArrayIndexOutOfBoundsException("数组索引越界"); }else { //根据索引来的话,直接返回这个索引对应的数据就可以了. return arr[index]; } } /* 删除数据,也是需要根据索引来进行删除 数组删除元素的步骤: 初始化数组:3,4,5,6,7 (0,1,2,3,4) 删除:4(1) 那么:3,5,6,7 (0,1,2,3) 数组长度:elements - 1 */ public void deleteIndex(int index){ if(index >= elements || index < 0){ throw new ArrayIndexOutOfBoundsException("数组索引越界"); }else{ //删除 for (int i = index; i < elements; i++) { arr[i] = arr[i+1]; } elements--; } } /* 根据传入的值进行删除 */ public void deleteData(long data){ for (int i = 0; i < elements; i++) { if (data == arr[i]){ //调用根据索引删除元素的方法 deleteIndex(i); } } } /* 修改数组中的元素,根据传入的数数据进行修改 找到值,进入重新赋值 upBefor:修改前 upAfter:修改后 有问题: */ public void update(long upBefor,long upAfter){ for (int i = 0; i < elements; i++) { //找到值,返回的是一个下标 int upbIndex = searchData(upBefor); if (upbIndex < 0 || upbIndex >= elements){ return; } //修改值 arr[upbIndex] = upAfter; } } /* 跟定下标,然后再修改 */ public void change(int index,int newData){ if(index >= elements || index < 0){ throw new ArrayIndexOutOfBoundsException("越界"); } //赋值 arr[index] = newData; } }
操作有序数组
插入需要有序
/* 添加数据 接收一个需要插入的数 */ public void insert(int value){ int i; //判断 for (i = 0; i < elements; i++) { if(arr[i] > value){ break; } } //循环完成,找到对应的位置 for (int j = elements; j > i; j--) { arr[j] = arr[j-1]; } arr[i] = value; elements++; }
二分查找元素
使用二分查找定位数据
/* 使用二分法进行查询数组中的元素 使用前提是这个数组必须是一个有序的数组 因为是从中间切分开,先进行一次判断,然后再进行查找 */ public int erfenSearch(long data){ int mid = 0; int low = 0; int pow = elements; while (true){ mid = (low + pow) /2; //判断在哪边 if(arr[mid] == data){ return mid; } else if(low > pow){ return -1;//找不到了 } else{ //中间的数大于左边的数,往左边找 if (arr[mid] > data){ pow = mid -1; }else { //往右边找 low = mid + 1; } } } }