import java.util.Arrays;
import java.util.Scanner;
public class Test{
public static void main(String[] args){
int[] arr={5,6,2,7,8,3,1,9};
Arrays.sort(arr);//排序
Scanner scan=new Scanner(System.in);
System.out.println("请输入需要查询的元素:");
int num=scan.nextInt();
int start=0;
int end=arr.length-1;
while(start<=end){
int mid =(start+end)/2;
if(num< arr[mid]){
end=mid-1;
}else if(num>arr[mid]){
start=mid+1;
}else{
System.out.println("你查询的元素的下标为:"+mid);
break;
}
}
}
}
三、数组扩展
1.数组的复制
浅表赋值
案例:
java复制代码
public class Test04{
public static void main(String[] args){
//原数组
String[] arr = {"张三","李四","王五"};
//新数组
String[] newArr = arr;
//修改原数组
arr[1] = "赵六";
//遍历新数组
for(String element : newArr){
System.out.println(element);
}
}
}
缺点:修改原数组,新数组中的数据也会发生改变
原理:
深表赋值
案例:
java复制代码
public class Test05{
public static void main(String[] args){
//原数组
String[] arr = {"张三","李四","王五"};
//新数组
String[] newArr = new String[arr.length];
//将原数组下标的元素赋值给新数组
for(int i = 0;i<arr.length;i++){
newArr[i] = arr[i];
}
//修改原数组
arr[1] = "赵六";
//遍历新数组
for(String element : newArr){
System.out.println(element);
}
}
}
原理:
2.数组的扩容
案例:
java复制代码
public class Test06{
public static void main(String[] args){
//原数组
String[] arr = {"张三","李四","王五"};
//计算新容量
int oldCapacity = arr.length;//3
int newCapacity = oldCapacity + (oldCapacity>>1);//4
//新数组
String[] newArr = new String[newCapacity];
//将原数组下标的元素赋值给新数组
for(int i = 0;i<arr.length;i++){
newArr[i] = arr[i];
}
//将新数组的地址赋值给原数组
arr = newArr;
//遍历原数组
for(String element : arr){
System.out.println(element);
}
}
}
3.数组的删除
方法一案例:
java复制代码
public class Test{
public static void main(String[] args){
//原数组
String[] arr = {"张三","李四","王五","赵六"};
//新数组
String[] newArr = new String[arr.length-1];//3 - [null,null,null]
int index = 0;
for(String element : arr){
if(!element.equals("李四")){
newArr[index++] = element;
}
}
//将新数组的地址赋值给原数组
arr = newArr;
//遍历原数组
for(String element : arr){
System.out.println(element);
}
}
}
缺点:数组作为容器,是存储数据的,这样的删除会让容器越变越小
方法二
java复制代码
public class Test{
public static void main(String[] args){
//原数组
String[] arr = {"张三","李四","王五","赵六"};
//将删除元素后一位的数据全部都往前移
for(int i = 1;i<arr.length-1;i++){
arr[i] = arr[i+1];
}
//将最后一位数据赋值为null
arr[arr.length-1] = null;
//遍历原数组
for(String element : arr){
System.out.println(element);
}
}
}
4.数组作为方法的参数和返回值
案例:设计一个方法,传入int类型的数组,返回最大值和最小值
java复制代码
public class Test{
public static void main(String[] args){
int[] arr = {5,78,55,26,23,51,32};
int[] newArr = getMaxAndMin(arr);
System.out.println("最大值为:" + newArr[0]);
System.out.println("最小值为:" + newArr[1]);
}
public static int[] getMaxAndMin(int[] arr){
int max = arr[0];
int min = arr[0];
for(int i = 1;i<arr.length;i++){
if(max < arr[i]){
max = arr[i];
}
if(min > arr[i]){
min = arr[i];
}
}
int[] maxAndMin = {max,min};
return maxAndMin;
}
}
5.可变参数
案例:设计一个方法,传入n个int类型的值,返回最大值
java复制代码
public class Test{
public static void main(String[] args){
int max = getMax(1,2,3,4,5,6,7);//将实参作为数组的元素传入
System.out.println(max);
}
//int... arr -- 可变参数,实际上就是数组
public static int getMax(int... arr){
if(arr.length == 0){//意味着实参没有传任何数据
return -1;
}
int max = arr[0];
for(int i = 1;i<arr.length;i++){
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
}