实现数组

package objectarray;

import java.util.Arrays;

public class MyArray {
	private int[] arr;
	
	public MyArray() {
		arr = new int[0];
	}
	
	
	public int size(){
		return arr.length;
	}
	
	
	/**
	 * 向数组的末尾添加一个元素
	 * @param target
	 */
	public void add(int target) {
		// 创建一个新的数组,长度为原数组+1
		int[] newArr = new int[arr.length+1];
		// 原数组复制到新数组中
		for(int i =0; i<arr.length; i++) {
			newArr[i] = arr[i];
		}
		// 将新元素添加到末尾
		newArr[arr.length] = target;
		// 替换原数组
		arr = newArr;
	}
	
	
	/**
	 * 删除数组中指定位置上的元素
	 * @param index
	 */
	public void delete(int index) {
		// 判断索引是否合法,注意每当操作索引的时候一定不要忘记合法性
		if(index < 0 || index > arr.length-1) {
			throw new RuntimeException("下标越界!");
		}
		// 创建一个新的数组,长度为原数组-1
		int[] newArr = new int[arr.length-1];
		for(int i = 0; i<newArr.length; i++) {
			if(i < index) {
				newArr[i] = arr[i];
			}else {
				newArr[i] = arr[i+1];
			}
		}
		
		arr = newArr;
	}
	
	
	/**
	 * 取出指定位置上的元素
	 * @param index
	 * @return
	 */
	public int get(int index) {
		if(index < 0 || index > arr.length-1) {
			throw new RuntimeException("下标越界!");
		}
		return arr[index];
	}
	
	
	/**
	 * 在指定的位置处插入数据
	 * @param index
	 * @param element
	 */
	public void insert(int index, int element) {
		int[] newArr = new int[arr.length+1];
		for(int i = 0; i<arr.length; i++) {
			if(i<index) {
				newArr[i] = arr[i];
			}else {
				newArr[i+1] = arr[i];
			}
		}
		
		// 最后把element插入到index位置处
		newArr[index] = element;
		arr = newArr;
	}
	
	
	/**
	 * 替换掉指定位置上的元素
	 * @param index
	 * @param element
	 */
	public void set(int index, int element) {
		if(index < 0 || index > arr.length-1) {
			throw new RuntimeException("下标越界!");
		}
		arr[index] = element;
	}
	
	/**
	 * 打印
	 */
	public void show() {
		System.out.println(Arrays.toString(arr));
	}
	
	
	/**
	 * 线性查找
	 * @param target
	 * @return
	 */
	public int search(int target) {
		for(int i = 0; i<arr.length; i++) {
			if(arr[i] == target) {
				return i;
			}
		}
		// 如果没有找到则返回-1
		return -1;
		
	}
	
	/**
	 * 二分查找
	 * @param target
	 * @return
	 */
	public int binarySearch(int target) {
		// 记录开始的位置
		int start = 0;
		// 记录结束的位置
		int end = arr.length-1;
		// 记录中间的位置
		int middle = 0;
		
		// 循环查找,由于不知道要找多少次才可以找到,所以使用while循环
		while(true) {
			middle = (start + end)/2;
			// 判断中间的这个元素是不是要查找的元素
			if(arr[middle] == target) {
				return middle;
			// 中间的这个元素不是要查找的元素
			}else {
				// 判断中间的这个元素是不是比目标元素大
				if(arr[middle] > target) {
					// 调整结束索引为中间索引的前一个索引
					end = middle-1;
				// 中间的这个元素是不是比目标元素小
				}else {
					// 调整开始索引为中间索引的后一个索引
					start = middle+1;
				}
			}
			
			// 走到这一步,一定是 start==end的情况都已经检查完了,也就是说二分的只剩下一个数的时候都已经检查完了,说明确实没找到,那就直接返回-1
			if(start > end) {
				return -1;
			}
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值