JAVA笔记_(Day04,Day05)函数&数组

2023-11-07

函数

定义

函数就是定义在类中的具有特定功能的一段独立小程序。函数在java中也称为方法。
格式

修饰符  返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
{
        执行语句;
        return 返回值;//return关键字是用于结束该功能。并将运算后的具体结果返回给调用者。
                                //必须有return语句
}
//注意:函数的返回类型如果是void时,return语句可以省略不写。return;
            void表示的是没有返回值的情况。

返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return:用于结束函数。
返回值:该函数运算后的结果,该结果会返回给调用者。

举例:

public static void main(String[] args) {
     for(int i=0;i<4;i++) {
			for(int j=0;j<5;j++) {
				System.out.print(j+"*"+i+"="+j*i+"\t" );				
			}
			System.out.println();			
	  }
}

输出:

*****
*****
*****
*****

问题:要画矩形,需要不断使用该for嵌套代码,造成代码复用性差。
解决:定义一个功能用于画矩形,每次只要使用该功能即可。这样提高复用性。

如何定义一个功能呢?
1.它应该是一个封闭的区间,就是大括号。
2.它需要有名称。
3.需要有参与运算的数据
4.需要定义该功能的结果类型。

在主方法中调用自定义的方法

public static void main(String[] args) {
			draw(4,5);		
	}
	
static void draw(int row,int col ) {
               if(row<0)
                    return;//如果row的值<0,直接结束。
		for(int i=0;i<row;i++) {
			for(int j=0;j<col;j++) {
				System.out.print("*");				
			}
			System.out.println();		
		}		
	}

总结:
函数就是一个功能。
功能就需要两个部分:
1.结果;2.未知内容。
明确1:这个功能的结果是什么?其实就是明确返回值类型。
明确2:这个功能需要未知内容是什么?其实就是明确参数列表。

练习

需求:需要一个方法,进行加法运算,获取两个整数的和。
明确1:功能的结果是什么?是一个和,和是整数。返回值的类型是int。
明确2:功能的未知内容有么?有,加数和被加数。都是int类型,这就是参数列表。

public static void main(String[] args) {
		int sum=add(4,5);
		System.out.println(sum);
	}	
	public static int add(int a,int b) {	
		return a+b;
	}	

误区

功能内只定义所需的内容,不需要的不定义。

重载(overload)

定义:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
特点:与返回值类型无关,只看参数列表。
优点:方便于阅读,优化了程序设计。

//函数名定义就是为了描述该功能。

	//两个整数求和的功能
	public static int add(int a,int b) {	
		return a+b;
	}
	//三个整数求和
	public static int add(int a,int b,int c) {	
		return a+b+c;
	}
	//两个小数的和
	public static double add(double a,double b) {	
		return a+b;
	}
//九九乘法表的重载
public static void printCFB() {
		for(int i=1;i<=9;i++) {
			for(int j=1;j<=9;j++) {
				System.out.print(j+"*"+i+j*i+"\t");
			}
			System.out.println();
		}
	}
	public static void printCFB(int num) {
		for(int i=1;i<=num;i++) {
			for(int j=1;j<=num;j++) {
				System.out.print(j+"*"+i+j*i+"\t");
			}
			System.out.println();
		}
	}

重载选择题练习

只要函数名相同,参数列表不同:顺序、个数、类型不同的都算重载。
给定void show(int a,float b,char c){}
下列哪些函数和给定函数重载了。
a.int show(int x,float y,char z){}
//没有重载,这个函数不允许和给定函数存在于同一个类中,因为会产生调用的不确定性。
b.void show(float b,int a,char c){}
//重载了,参数列表不同,顺序不同
c.void show(int c,float a,char b){}
//没有重载,和给定函数,不允许存在
d.void show(int a,int b,int c){}
//重载了,因为类型不同
e.double show(){}
//重载了,因为个数不同

函数的内存调用问题

举例:

public static void main(String[] args) {
		int sum=add(4,5);
		System.out.println(sum);
	}	
	public static int add(int a,int b) {	
		return a+b;
	}	

栈:先进栈的后出栈
进栈(压栈) 出栈(弹栈)

数组

定义

概念:同一种类型数据的集合。其实数组就是一个容器。
优点:数组可以存储多个数据,可以自动给数组中的元素从0开始编号,方便通过编号(索引)操作这些元素。
数组中的元素默认为0。
格式1:

//元素类型[] 数组名=new 元素类型[元素个数或数组长度];
//示例如下:
int[] arr=new int[5];//通过new关键字创建了一个长度为5,元素类型为int的数组实体

格式2:

//元素类型[] 数组名=new 元素类型[]元素,元素,……];
//示例如下:
int[] arr=new int[]{3,5,1,7};
int[] arr={3,5,1,7};
int[] arr= {34,56,78,12,25,46};	
for(int i=0;i<arr.length;i++)//arr.length是数组的长度
     System.out.println("arr["+i+"]="+arr[i]);

数组的内存图解

java对内存空间的划分,分为五部分:
栈、堆、方法区、本地方法区、寄存器。

栈内存:
存储的都是局部变量,只要是在方法中定义的变量都是局部变量
一旦变量的生命周期结束,该变量就被释放。

堆内存:
存储的都是实体(对象)能被new创建的
每一个实体都有一个首地址值。
堆内存的变量都有默认初始化值。
不同类型不一样.int:0;double:0.0;boolean:false;char:’\u000’

堆把首地址告诉栈即可,arr是引用型变量,当不想把arr指向实体时,只要将arr=null;
当实体不再使用时,就会被垃圾回收机制处理。


数组的常见问题

1.Array Index out of Bounds Exception数组角标溢出异常//访问到了数组不存在的索引时,会发生该异常。
2.Null Pointer Exception空指针异常//当使用没有任何实体指向的引用变量操作实体时,运行会发生该异常。

应用

数组常见操作
1.获取最值(最大值,最小值)
2.排序(选择排序,冒泡排序)
3.折半查找(二分查找)

求和

需求:获取多个数的和的功能。
明确1:结果?int
明确2:参数?多个数,定义多个参数合适吗?既然是一组数,数组。
步骤:
1.定义变量,记录和
2.通过循环对数组进行遍历

public static void main(String[] args) {
		int[] arr=new int[] {23,44,1,23,56,78};
		add(arr);
		}
	
    public static int add(int[] arr) {
    	int sum=0;
    	for(int i=0;i<arr.length;i++) {
    		sum+=arr[i];  		
    	}
    	return sum;
    }

最大值

需求:获取多个整数中最大值。
思路:
1.数据多了,为了便于操作,需要容器,用数组。
2.多个数据需要进行比较,每次都有较大的数,需要记录下来和下一个数比较。
3.将数组中的元素都比一遍。最后,就有了最大值。
步骤:
1.需要数组。
2.定义一个变量记录住较大的数。
3.对数组进行遍历,让元素和较大的值进行比较。
如果元素大于较大的数,用变量记录该元素。
4.遍历完成后,变量中记录就是最大值。
//定义功能。
明确1:结果?最大值。
明确2:参数?int[].

public static void main(String[] args) {
		int[] arr=new int[] {23,44,1,23,56,78};
		int max=getMax(arr);
		System.out.println("max="+max);
		}
	
    public static int getMax(int[] arr) {
    	int max=arr[0];
    	for(int i=1;i<arr.length;i++) {
    		if (max<arr[i])
    		 max=arr[i]; 		
    	}
    	return max;
    }

另一种把public static int getMax(int[] arr){ }中的内容替换为

public static int getMax_2(int[] arr) {
    	int max=0;//初始化为数组中的任意一个角标
    	for(int i=1;i<arr.length;i++) {
    		if (arr[max]<arr[i])
    		 max=i; 		
    	}
    	return arr[max];
    }

将数组转成字符串

需求1:定义功能,将[34,12,67]数组中的元素转成字符串“[34,12,67]”
明确1:结果?字符串。
明确2:参数?数组。
思路:简单的方式就是利用了字符串和任何数据相加都是相连接。
步骤:
1.定义字符串变量
2.遍历数组。将每一个数组的元素和字符串相连接。
3.将连接后的字符串返回。

public static void main(String[] args) {
		int[] arr=new int[] {23,44,1,23,56,78};
		String  str=toString(arr);
		System.out.println("string="+str);
		}
	
    public static String toString(int[] arr) {
    	String temp="[";//初始化为[字符串
    	for(int i=0;i<arr.length;i++) {  		
    		if (i!=arr.length-1)
    			temp=temp+arr[i]+",";
    		else 
    			temp=temp+arr[i]+"]";   			
    	}
    	return temp;
    }

结果:

string=[23,44,1,23,56,78]

查表法

数组使用的核心思想:
容器特点:1.固定长度;2.元素都有索引。
什么时候使用容器呢?数据多了,必须先进行存储,然后进行操作。
对于数组容器什么时候用呢?数据多,个数确定,而且有对应关系。
在分析需求时:
1.需求中的数据是否有对应的有序编号?
2.需求中的数据是否需要有序的编号。
如果有,就用数据存储。
例1:一组数:34 89 12 78 45 要对他们进行操作。需要编号,操作更容易。
例2:根据用户输入的数据,显示对应的星期。
思路:
1.星期有多个,个数固定。
2.星期对应的有序编号,有序的编号就可以作为索引。
所以可以使用数组这种结构进行存储。
需求:
定义一个功能,根据给定的数据获取对应的星期。
查表法:数据之间存在对应关系,通过关系中一方查询另一方。
当对应关系存在,但没有一方是有序编号时,使用另一个容器map
步骤:
1.定义一个数组,存储固定的星期数。这个称之为一个存储了对应关系的表。

public static void main(String[] args) {
		int num=7;
		String  week=getWeek(num);
		System.out.println(num+"对应的星期为"+week);
		}
	
    public static String getWeek(int num) {
    	String[] weeks = new String[]{"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};//其实就是根据制定的索引在查表   
    	if (num>7||num<1)
    		return num+"没有对应的星期";//throw new RuntimeException("没有对应的星期");抛出异常,return结束当前功能,抛出异常是结束当前程序
    	else   		 	
    	    return weeks[num];   	
    }

转十六进制

需求:十进制—>十六进制
&15 >>>4 循环
原本:

public static void main(String[] args) {
		int num=60;
		for(int i=0;i<8;i++) {//4个8位
			int temp=num&15;
			if (temp>9)
				System.out.println((char)(temp-10+'A'));
			else
				System.out.println(temp);
			num=num>>>4;			
		}
	}

解决问题:
1.顺序反了。2.去除多余的0.
解决方式:
1.每运算出一位,不要打印,先存储,需要容器。
2.去除零?需要转换的数据会不断地右移,如果右移后剩余的二进制都是0,也就是没有有效位,就不需要进行&运算了。也就是不需要再往数组中存储了。

public static void main(String[] args) {
		int num=60;
		String str_hex=toHex(num);
		System.out.println(str_hex);
	}
	
    public static String toHex(int num) {    	
		//1.定义容器,存储的是字符,长度位8,一个整数最多8个16进制位。
    	char[] chas=new char[8];
    	//2.定义一个用于操作数组的索引。
    	//int index=chas.length-1;
    	  int index=chas.length;
    	//for(int i=0;num!=0&&i<8;i++) {
    	//for(;num!=0;) {
    	while(num!=0) {
			int temp=num&15;
			if (temp>9)
		//		chas[index]=((char)(temp-10+'A'));
				chas[--index]=((char)(temp-10+'A'));
			else
		//		chas[--index]=((char)(temp+'0'));
				chas[--index]=((char)(temp+'0'));
			//3.让角标自增。
		//	index--;
			num=num>>>4;				
    	}
    	/*
    	// 4.遍历数组。
    	for(int i=0;i<chas.length;i++) {
    		System.out.print(chas[i]+",");   		
    	}
    	*/
    	System.out.println("index="+index);
    	return "0x"+toString(chas,index);
    }
           //定义一个功能,将字符数组转成字符串
        public static String toString(char[] arr,int index){
    	String temp="";
    	for(int i=index;i<arr.length;i++) {
    		temp=temp+arr[i];    		
    	}
    	return temp;
    }

查表版(十六进制终极版)

思路:
十进制转成十六进制的每一位都是十六进制元素中的某一个。
十六进制中的元素有很多固定个数,而且还有对应的编号。
所以可以使用传说中的查表法。

	public static void main(String[] args) {
		int num=60;
		String str_hex=toHex(num);
		System.out.println(str_hex);
	}
	
    public static String toHex(int num) {    	
		//1.建立表。
    	char[] chs= {'0','1','2','3',
    			     '4','5','6','7',
    			     '8','9','A','B',
    			     'C','D','E','F'};
    	
        //2.创建临时容器。
    	char[] arr=new char[8];
    	
    	//创建操作临时容器的索引。
    	int index=arr.length;
    	
        //4.通过循环对num进行& >>>等运算
    	while(num!=0) {
    		//5.对num进行&运算。
    		int temp=num&15;
    		
    		//根据&运算后的结果作为角标查表,获取对应字符,并将字符存储放到临时容器中。
    		arr[--index]=chs[temp];
    		
    		//7.对num进行右移。
    		num=num>>>4;   		
    	}
    	return "0x"+toString(arr,index);       	
    }
        public static String toString(char[] arr,int index){
	       String temp="";
	       for(int i=index;i<arr.length;i++) {
		      temp=temp+arr[i];    		
	       }
	        return temp;
         }

十进制转二进制

public static void main(String[] args) {
		int num=60;
		String binary=toBina(num);
		System.out.println(hex);
	}
	//将输出的数字存储在数组中,返回类型为char,输入的参数列表为int
    public static String toBina(int num) {
    	//查表
    	char[] binary= {'0','1'};
	    //建立新的存储容器
    	char[] arr=new char[32];
    	//建立索引
    	int index=arr.length;
    	while(num!=0) {
    		int temp=num&1;
    		arr[--index]=hex[temp];
    		
    		num=num>>>1;
    	}
    	return toString(arr,index);
    }
    public static String toString(char[] arr,int index) {
    	String temp="";
    	for(int i=index;i<arr.length;i++) {
    	    temp=temp+arr[i];
        }  
        return temp;
    }

进制转换(通用版)

public static void main(String[] args) {
		int num=60;
		String str_hex=toHex(num);
		String str_binary=toBinary(num);
		String str_oct=toOctal(num);
		System.out.println(num+"的十六进制为"+str_hex);
		System.out.println(num+"的二进制为"+str_binary);
		System.out.println(num+"的八进制为"+str_oct);
	}
	//十进制-->十六进制
	public static String toHex(int num) {
		return "0x"+trans(num,15,4);
	}
	
	//十进制-->二进制
	public static String toBinary(int num) {
		return trans(num,1,1);
	}
	
	
	//十进制-->八进制
	public static String toOctal(int num) {
		return "0"+trans(num,7,3);
	}
	
	
	//用于进制转换
    public static String trans(int num,int base,int offset) {    	
		//1.建立表。
    	char[] chs= {'0','1','2','3',
    			     '4','5','6','7',
    			     '8','9','A','B',
    			     'C','D','E','F'};
    	
        //2.创建临时容器。
    	char[] arr=new char[32];
    	
    	//创建操作临时容器的索引。
    	int index=arr.length;
    	
        //4.通过循环对num进行& >>>等运算
    	while(num!=0) {
    		//5.对num进行&运算。
    		int temp=num&base;
    		
    		//根据&运算后的结果作为角标查表,获取对应字符,并将字符存储放到临时容器中。
    		arr[--index]=chs[temp];
    		
    		//7.对num进行右移。
    		num=num>>>offset; //偏移量  		
    	}
    	return toString(arr,index);       	
    }
        public static String toString(char[] arr,int index){
	       String temp="";
	       for(int i=index;i<arr.length;i++) {
		      temp=temp+arr[i];    		
	       }
	        return temp;
         }

总结:java有一种帮助文档,里面封装了很多函数。
包括进制转换:

//java已提供的功能
System.out.println(Integer.toBinaryString(28));
System.out.println(Integer.toOctalString(28));
System.out.println(Integer.toHexString(28));

选择排序

数组的排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
外循环:不同起点
内循环:同起点的不同箭头
确定头(最小)

public static void main(String[] args) {
		int[] arr=new int[] {12,9,23,77,6,34};
		printArray(arr);
	    selectSort(arr);
	    printArray(arr);		
	    }
	
	//打印数组的方法
	public static void printArray(int[] arr) {		
		for(int i=0;i<arr.length;i++) {
	    	if(i!=arr.length-1)
	    	   System.out.print (arr[i]+",");
	    	else
	    	   System.out.println (arr[i]);
	    }
	}
	//数组的排序,选择排序
	public static void selectSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			for(int j=i+1;j<arr.length;j++) {
				if(arr[i]>arr[j]) {
					int temp=arr[i];
					arr[i]=arr[j];
					arr[j]=temp;
				}
			}
		}
		
	}

冒泡排序

确定尾(最大)

public static void main(String[] args) {
		int[] arr=new int[] {12,9,23,77,6,34};
		printArray(arr);
	    bubbleSort(arr);
	    printArray(arr);		
	    }
	
	//打印数组的方法
	public static void printArray(int[] arr) {		
		for(int i=0;i<arr.length;i++) {
	    	if(i!=arr.length-1)
	    	   System.out.print (arr[i]+",");
	    	else
	    	   System.out.println (arr[i]);
	    }
	}
	//数组的排序,冒泡排序
	public static void bubbleSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]>arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}		
	}

java中也有直接的包

import java.util.Arrays;
public class Myclass1 {

	public static void main(String[] args) {
		int[] arr=new int[] {12,9,23,77,6,34};
		printArray(arr);
	       Arrays.sort(arr);//开发时用该调优。
	       printArray(arr);		
	    }	
	//打印数组的方法
	public static void printArray(int[] arr) {		
		for(int i=0;i<arr.length;i++) {
	    	if(i!=arr.length-1)
	    	   System.out.print (arr[i]+",");
	    	else
	    	   System.out.println (arr[i]);
	    }
	}

发现排序方法,位置置换代码重复,进行抽取。

	public static void main(String[] args) {
		int[] arr=new int[] {12,9,23,77,6,34};
		printArray(arr);
		selectSort(arr);
	    //Arrays.sort(arr);
	    printArray(arr);	
		bubbleSort(arr);
	    //Arrays.sort(arr);
	    printArray(arr);		    
	    }
	
	//打印数组的方法
	public static void printArray(int[] arr) {		
		for(int i=0;i<arr.length;i++) {
	    	if(i!=arr.length-1)
	    	   System.out.print (arr[i]+",");
	    	else
	    	   System.out.println (arr[i]);
	    }
	}
	//数组的排序,选择排序
		public static void selectSort(int[] arr) {
			for(int i=0;i<arr.length-1;i++) {
				for(int j=i+1;j<arr.length;j++) {
					if(arr[i]>arr[j]) {
						swap(arr,i,j);
					}
				}
			}
		}
	//数组的排序,冒泡排序
	public static void bubbleSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]>arr[j+1]) {
					swap(arr,j,j+1);
				}
			}
		}
		
	}
	public static  void swap(int[] arr,int a,int b) {//角标要先有数组
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;		
	}

普通查找方式

需求:查找一个元素在数组中的第一次出现的位置。

public static void main(String[] args) {
		int[] arr=new int[] {12,9,23,77,6,34};
		int x=searchKey(arr,77);
		System.out.println(x);
	    }
	
	//打印数组的方法
	public static int searchKey(int[] arr,int key) {		
		//遍历查找
		for(int i=0;i<arr.length;i++) {
			if(arr[i]==key)
				return i;
		}
		//数组中不存在的角标,为-1
		return -1;//代表角标不存在的情况
	}

二分查找方式

前提:数组必须是有序(递增或递减)的。

思路:
1.通过角标先获取中间角标上元素。
2.让该元素和要找的数据比较。
3.如果要找的数大了,缩小范围,要找的范围应该是 中间的角标+1-----尾角标。
4.如果要找的小了,缩小范围,要找的范围应该是 头角标-----中间的角标+1。
5.不断如此重复,就可以找到元素对应的角标。

public static void main(String[] args) {
		int[] arr=new int[] {9,12,15,24,36,41,59,68};
		int index=binarySearch(arr,41);
		System.out.println("index="+index);
	    }
	public static int binarySearch(int[] arr,int key) {		
		//1.定义三个变量,记录头角标、尾角标、中间角标
		int min,max,mid;
		min=0;
		max=arr.length-1;
		mid=(min+max)>>1;
			while(arr[mid]!=key) {
				if(arr[mid]>key)
					max=mid-1;
				else
					min=mid+1;
			      //判断元素是否存在
				if (max<min)
					return -1;
				mid=(min+max)>>1;
			}
				return mid;			
		}

还有一种是把 public static int binarySearch(int[] arr,int key) { }中的内容换成

public static int binarySearch(int[] arr,int key) {
		//1.定义三个变量,记录头角标、尾角标、中间角标
				int min,max,mid;
				min=0;
				max=arr.length-1;
				while(min<=max) {
					mid=(min+max)>>1;
					if(key<arr[mid])
						max=mid-1;
					else if(key>arr[mid])
					min=mid+1;
					else
						return mid;
				}
				return -1;

数组中的数组[][]

开发时并不常用
比如说俄罗斯方块的坐标点

格式1

int[][] arr=new int[3][2];

定义了名称为arr的二维数组;
二维数组中有3个一维数组;
每一个一维数组中有2个元素;
一维数组的名称分别为arr[0],arr[1],arr[2];
给第一个一维数组1脚标位赋值为78写法为:arr[0][1]=78。
二维数组分布情况:

int[][] arr=new int[3][2];
System.out.println(arr);
//输出为[[I@15db9742//二位数组实体。//@右边为哈希值,实体在内存中存放的位置;@左边[是数组,[[是而二维数组,I是类型int.
System.out.println(arr[0]);//输出为[I@6d06d69c//一维数组实体。
System.out.println(arr[0][0]);//一维数组中的元素。

格式2

int[][] arr=int[3][];

二维数组中有3个一维数组;
每个一维数组都是默认初始值null;
可以对这个三个一维数组分别进行初始化
arr[0]=new int[3];
arr[1]=new int[1];
arr[2]=new int[2];
二维数组分布情况:

定义一维数组后的分布:

int[][] array=new int[3][];//明确了二维数组的长度,没有明确具体的一维数组。
System.out.println(array);//输出为[[I@15db9742
System.out.println(array[0]);//null
System.out.println(array[0][0]);//NullPointerException空指针

格式3

int[][] arr= {{23,17,11},{88,11,33,90},{11,78,34}};
		//求和
		int sum=0;
		for(int i=0;i<arr.length;i++) {//遍历二维数组
			for(int j=0;j<arr[i].length;j++)
			
			sum+=arr[i][j];			
		}		
		System.out.println(sum);

数组的练习

数组反转

需求:对一个给定的数组进行反转。
[23,14,88,5]–>
[5,88,14,23]

  public static void main(String[] args) {
		int[]arr= new int[] {23,14,88,5};
	    reverse(arr);	
	    }
    public static void reverse(int[] arr) {
    	for(int start=0,end=arr.length-1;start<end;start++,end--) {
    		swap(arr,start,end);
    		
    	}   	
    }
	public static void swap(int[] arr,int a,int b) {
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
	}

获取插入点

需求:如果往有序的数组中插入一个元素并继续保持有序,问如何获取该位置?
思路:
1.既然是有序的数组,而且是找位置,必须要想到二分查找法。

public static void main(String[] args) {
		
		int[]arr= new int[] {9,13,17,22,31,46,58,77};
	    int index=binarySearch(arr,7);	    
	    System.out.println("index="+index);
	    }
	    
    public static int binarySearch(int[] arr,int key) {
        int min,max,mid;
        min=0;
        max=arr.length-1;
        while(min<=max) {
        	mid=(min+max)>>1;
        	if(key<arr[mid])
        		max=mid-1;
        	else if(key>arr[mid])
        		min=mid+1;
        	else 
        		return mid;      	
        }
    		return min;
    	}   	

或者直接用java里的封装函数

import java.util.Arrays;
public class Myclass1 {
public static void main(String[] args) {
		
		int[]arr= new int[] {9,13,17,22,31,46,58,77};
		int index=binarySearch(arr,7);	    
		System.out.println("index1="+index);
	    int index2=Arrays.binarySearch(arr,7);	    
	    System.out.println("index2="+index2);
	    }
	    
    public static int binarySearch(int[] arr,int key) {
        int min,max,mid;
        min=0;
        max=arr.length-1;
        while(min<=max) {
        	mid=(min+max)>>1;
        	if(key<arr[mid])
        		max=mid-1;
        	else if(key>arr[mid])
        		min=mid+1;
        	else 
        		return mid;      	
        }
    		return -(min+1);//如果该数不存在,用负数告诉该值不存在且插入值在哪里。还可以避免-0.
    	}   	
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA笔记_(Day04,Day05)函数&数组 的相关文章

  • 使用 Guice 注入类集合

    我正在尝试用 Google Guice 2 0 注入东西 我有以下结构 FooAction implements Action BarAction implements Action 然后我有一个带有以下构造函数的 ActionLibrar
  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • javax.persistence.RollbackException:提交事务时出错],根本原因是 java.lang.StackOverflowError:null

    我有一个使用 Spring Data REST 框架的 Spring Boot API 从 spring boot starter parent 2 1 0 RELEASE 继承的依赖项 我正在尝试执行 PUT 或 PATCH 请求来更新实
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径

随机推荐

  • C++ 动态数组

    C 语言和标准库提供了两种一次分配一个对象数组的方法 C 语言定义了另一种new表达式语法 可以分配并初始化一个对象数组 标准库中包含一个名为allocator的类 允许我们将分配和初始化分离 使用allocator通常会提供更好的性能和更
  • Windows 配置双网卡

    1 内网的IP地址要提前知晓备份 外网的IP地址是自动获取的 2 查看当前路由 输入命令 route print 则会看到如下的地址 第一条是默认的外网地址 表示无论访问什么地址都是需要从该IP访问 3 删除原来路由 配置的时候 需要先删除
  • 临床预测模型之生存资料的ROC曲线绘制

    本文首发于公众号 医学和生信笔记 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 主要分享R语言做医学统计学 meta分析 网络药理学 临床预测模型 机器学习 生物信息学等 生存资料的ROC曲线考虑了时间因素 在画RO
  • 【毕设选题】基于STM32的毕业设计题目项目汇总 - 350例

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 4 最后 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下
  • Java正则表达式替换占位符

    项目中使用一个功能 替换字符串中的占位符 当占位符的名称相近时 如 id 和 id1 不能完全区分替换 测试代码如下 测试1 String JAVARGGEX a zA Z0 9 String text id 1 and idx 3 Pat
  • R语言基础编程

    实验二 数据对象与数据读写 实验目的 1 了解R语言中的数据结构 2 了解R语言中数据类型的判别及转换函数 及其应用方法 3 了解R语言中对数据结构操作的函数 及其应用方法 4 了解R语言中读写数据文件的方法 实验内容与实现 1 创建一个对
  • CentOS安装Eigen

    1 下载 切换到root用户 su root 切换root用户 要输入密码 cd 切换到root的家目录 wget http bitbucket org eigen eigen get 3 3 7 tar gz 下载Eigen 2 解压安装
  • cmd命令行访问远程mysql数据库

    示例 mysql uhello pworld h 192 168 1 88 P 3306 D mysql oa mysql u用户名 p密码 h 远程数据库IP地址 P 端口 D 数据库名 连接成功后就可以想操作本地数据库一样了 感觉是不是
  • 现在完成时

    定义一 过去做的动作或状态 导致现在 如果时态是 现在完成时 have has v过去分词 当主语是第三人称单数时使用 has 我已经看过这部电影了 let s watch another movie i have already seen
  • SQL查询in大于1000处理

    近期在代码开发中 发现某些业务场景因为多个服务的调用查询 避免不了使用in 当in的数量小于1000的时候 可以正常使用 但是当in的数量大于1000的时候就会出现报错 针对此类问题主要有两个场景 1 使用Mybatis在XML中写SQL
  • 解决npm 乱报错

    使用npm 下载vue socket io npm报路径错误 解决方案 删除npmrc文件 强调 不是nodejs安装目录npm模块下的那个npmrc文件 而是在C Users 账户 下的 npmrc文件 注意 这个文件默认是被隐藏 一定要
  • gdb+vscode进行调试1——使用CMakelist文件进行编译和调试+附加进程调试

    1 建立工程文件 文件树如下 2 make sh脚本文件如下 bin bash cmake make 重要 必须添加权限 sudo chmod x make sh 3 CMakelist文件如下 cmake minimum required
  • Qt程序发布(Qt6.2.2+MinGW11.2.0+win10)

    前言 近几天 又有小伙伴问我程序发布的事 这个问题本不复杂 但对一个新手来说 还是有点难度的 为此 笔者简单介绍下Qt在windows下 发布程序的一般方法 本次以Qt6 2 2 MinGW11 2 0 win10为例 其他版本的方法类似
  • undo日志insert,update,delete (1)—mysql进阶(六十四)

    前面说了redo日志为了保证系统宕机的情况下 能够恢复数据 恢复数据是在以checkpoint lsn为起始位子来恢复 在该值之前的都是已经持久化到磁盘的 可以为了提升效率而放弃 而之后的数据 也可能在checkpoint之后 被后台异步运
  • mysql如何获取当前时间_mysql怎么获取当前时间

    mysql获取当前时间的方法 可以通过执行 select now 语句来获取当前时间 还可以通过执行 select current timestamp current timestamp 语句来获取 获得当前日期 时间 date time
  • ordfilt2函数功能说明

    转自 http www ilovematlab cn thread 91331 1 1 html ordfilt2函数在MATLAB图像处理工具箱中提供了二维统计顺序滤波函数ordfilt2函数 二维统计顺序滤波是中值滤波的推广 对于给定的
  • 对于强化学习的梳理

    强化学习 增强学习 概述 知识联系 强化学习是属于机器学习的一种 机器学习主要分监督学习 非监督学习 半监督学习 增强学习 强化学习的核心逻辑 那就是智能体 Agent 可以在环境 Environment 中根据奖励 Reward 的不同来
  • C语言学习打卡第8天

    一 函数第二部分的练习 1 有3 4的矩阵 初始化他并输出 还求出最大值输出 include
  • 计算机视觉算法——目标检测网络总结

    计算机视觉算法 目标检测网络总结 计算机视觉算法 目标检测网络总结 1 RCNN系列 1 1 RCNN 1 1 1 关键知识点 网络结构及特点 1 1 2 关键知识点 RCNN存在的问题 1 1 3 关键知识点 非极大值抑制算法 NMS 1
  • JAVA笔记_(Day04,Day05)函数&数组

    文章目录 函数 定义 练习 误区 重载 overload 重载选择题练习 函数的内存调用问题 数组 定义 数组的内存图解 数组的常见问题 应用 求和 最大值 将数组转成字符串 查表法 转十六进制 查表版 十六进制终极版 十进制转二进制 进制