目录
一、方法与数组
1、方法
i、方法的定义
ii、方法的格式
iii、参数
iv、返回值
v、方法重载overloading method
2、数组
i、数组的定义
ii、定义数组
iii、数组的遍历
iv、数组注意问题
v、示例
3、算法
i、冒泡排序算法
ii、选择排序算法
iii、直接插入排序算法
iv、二分查找算法
v、Arrays类
4、方法与数组双色球案例
方法就是一段特定功能的代码块,也叫函数,提高程序的复用性和可读性。
语法:
访问权限修饰符[其他的修饰符 如static] 返回值类型 方法名(参数类型1 形参1,参数类型2 形参2...){
// 形参列表
// 方法体
return 返回值;
}
返回值类型,也就是功能的数据类型,后面我们可以定义实体;
方法名:见名知意,首字母小写,驼峰命名;
public class Test{ public static void main(String[] args){ getMenu(); //调用方法,此时方法才会运行。 printStar(1); } // public 访问权限修饰符 // static 静态修饰符,描述的方法可以直接调用 // void(无返回值) public static void getMenu(){ System.out.println("这是一个方法!"); } // 带参数的方法 // 在方法定义时的参数称为形参,调用时为实参 public static void printStar(int line){ System.out.println("这是一个方法!"); } }
实际参数:就是实际参与运算的参数;
形式参数:就是方法定义上的,用于接收实际参数的;
参数类型:就是参数的数据类型;
参数名:就是变量名;
方法体语句:就是完成功能的代码
注意:若当前方法中不要使用形参,那么形参列表中可以为空;
实参和形参的类型要相互兼容,实参范围小于等于形参的范围。
return: 用于结束方法的。
返回值:就是功能的结果,或者方法运行的最终结果,由return带给调用者。
注意:若当前方法没有返回值类型,即返回值为void,那么当前方法中可以不写return;
return即表示结束一个方法,也可以将返回值返回给调用当前方法的调用者
return返回值时一次只能返回一个值,不可以返回多个值;
一个方法中可以有多个return,但被执行的只能由一个,所以需要判断;
在类中可以创建多个方法,他们具有相同的名字,但具有不同的参数和不同的定义;
返回值不能作为重载的条件。
public class Test{ public static void main(String[] args){ int result = add(10,20); System.out.println(result) } public static int add(int a,int b){ return a+b } public static int add(float a,float b){ return a+b } }
一组能够存储相同数据类型的变量的集合。
数组是一种线性数据存储的结构,具有存取效率高,内存空间连续的特点,数组必须具有固定长期,常用的数据结构。
使用默认的初始值来初始化数组中的每一个元素
数组元素类型[] 数组名 = new 数组元素类型[数组中元素的个数(数组的长度)];
int [] scores = new int[3];
先声明,然后在赋予数组默认的初始值
数组元素类型[] 数组名;
数组名 = new 数组元素类型[数组中元素的个数(数组的长度)];
int [] scores;
scores = new int[3];
先声明,然后再使用指定的值进行初始化。
数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2,....};
int[] scores = new int[]{56,78,98};
简化写法:
int [] scores = {56,78,98};
public class Test{ public static void main(String[] args){ int[] nums = new int[5]; nums[0]=1; nums[1]=2; nums[2]=3; nums[3]=4; nums[4]=5; int[] num; num = new int[5]; for(int i=0;i<num.length;i++){ num[i]=i+1; } int[] num1={1,2,3,4,5}; } }
求数组的长度用x.length
通过下标来访问数组中的元素。
下标:从0开始,到数组长度-1
遍历:依次取出数组中的每一个元素。
遍历方式:普通的for循环
for(int i =0;i<数组长度;i++){
// i :循环变量,也是数组的下标
数组中元素的类型 变量 = 数组名[i];
}
jdk1.5新增:forearch遍历
for(int x:scores){
Systen.out.println(x)
}
注意:可变参数可以作为数组使用,可变参数必须是参数列表最后一个参数,在数据类型后跟三个点...;在方法调用时,直接传值,不需要再定义数组。
空指针异常(NullPointerException)
当一个变量为null(没有赋值时),我们调用了该变量的属性和方法
数组越界异常(ArrayIndexOutOfBoundsException)
也就是超过了数组长度;
数组内存数据结构分析:
数组是引用类型,会存放再堆中;
import java.util.Scanner public class Test{ public static void main(String[] args){ int[] nums={12,13,15,34,23}; Scanner input = new Scanner(System.in); System.out.println("请输入你要猜的数:"); int userNum = input.nextInt(); boolean flag = false; for(int x:nums){ if(userNum==x){ flag = true; break; } } if(flag){ System.out.println("恭喜你猜对了!"); }else{ System.out.println("没猜中"); } } }
二维数组:java中没有真正的多维数组,多维数组的表示方式是数组中的元素还是数组。
题:有三个班级各三名学员参赛,记录每个学员的成绩,并计算每个班的平均分
public class Test{ public static void main(String[] args){ int[][] scores = {{78,98,88},{87,99,89},{67,87,89}}; int classLen = scores.length; for(int i=0;i<classLen;i++){ int sum = 0; int count = scores[i].length; for(int j=0;j<count;j++){ sum+=scores[i][j]; } int avg = sum/count; System.out.println("第"+(i+1)+"班的平均成绩是:"+ avg); } } }
比较相邻的元素,如果第一个比第二个大,就交换他们两个。
对每一队相邻元素做同样的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数。
针对所有的元素重复上面的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
public class Test{ public static void main(String[] args){ int[] nums = {1,45,32,24,26,56,78,23}; //外循环控制轮数 for(int i=0;i<nums.length-1;i++){ //比较轮数等于数列长度-1 for(int j=0;j<nums.length-1-i;j++){ if(nums[j]>nums[j+1]){ nums[j]=nums[j]+nums[j+1]; nums[j+1]= nums[j]-nums[j+1]; nums[j] = nums[j]-nums[j+1]; } } } for(int n: nums){ System.out.println(n) } } } /** * 1 45 32 24 26 56 78 23 * 1 32 34 26 45 56 23 78 7次 * 1 32 26 34 45 23 56 6次 * 1 26 32 34 23 45 5次 * 1 26 32 23 34 4次 * 1 26 23 32 3次 * 1 23 26 2次 * 1 23 1次 */ //交换数据 a = a+b;b=a-b;a=a-b;
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好的数列的最后,知道全部待排序数据元素排完,选择排序是不稳定的排序方法。
public class Test{ public static void main(String[] args){ int[] nums = {1,45,32,24,26,56,78,23}; int minIndex = 0;// 用于记录每次比较的最小值下标 //外循环控制轮数 for(int i=0;i<nums.length-1;i++){ //比较轮数等于数列长度-1 minIndex = i;// 每轮假设一个最小值下标 for(int j=i+1;j<nums.length;j++){ if(nums[minIndex]>nums[j]){ minIndex=j; } } //判断需要交换的数下标是否为自己 if(minIndex != i){ nums[minIndex] = nums[minIndex] + nums[i]; nums[i] = nums[minIndex]-nums[i]; nums[minIndex]=nums[minIndex]-nums[i]; } } for(int n: nums){ System.out.println(n) } } } /** * 1 45 32 24 26 56 78 23 * 1 45 32 24 26 56 78 23 7次 * 1 23 32 24 26 56 78 45 6次 * 1 23 24 32 26 56 78 45 5次 * 1 23 24 26 32 56 78 45 4次 * 1 23 24 26 32 56 78 45 3次 * 1 23 24 26 32 45 78 56 2次 * 1 23 24 26 32 56 56 78 1次 */
从后向前找到合适的位置后插入,每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,知道全部插入排序完为止;
public class Test{ public static void main(String[] args){ int[] nums = {1,45,32,24,26,56,78,23}; int minIndex = 0;// 用于记录每次比较的最小值下标 //外循环控制轮数 for(int i=1;i<nums.length;i++){ //比较轮数等于数列长度 int temp = nums[i];// 记录操作数 int j = 0; for(int j=i-1;j>=0;j--){ if(nums[j]>nums[temp]){ nums[j+1]=nums[j] }else{ break; } } //判断需要交换的数下标是否为自己 if(nums[j+1] != temp){ nums[j+1]=temp } } for(int n: nums){ System.out.println(n) } } } /** * 1 45 32 24 26 56 78 23 * 第一轮 i=1 1 45 32 24 26 56 78 23 * 1 45 32 24 26 56 78 23 * * 第二轮 i=2 1 45 45 24 26 56 78 23 * 1 32 45 24 26 56 78 23 * * 第三轮 i=3 1 32 45 45 26 56 78 23 * 1 32 24 45 26 56 78 23 1 24 32 45 26 56 78 23 * * 第四轮 i=4 1 24 32 45 45 56 78 23 * 1 24 32 26 45 56 78 23 * 1 24 26 32 45 56 78 23 * * 第五轮 i=5 1 24 26 32 45 56 78 23 * * 第六轮 i=6 1 24 26 32 45 56 78 23 * * 第七轮 i=7 1 24 26 32 45 56 78 78 * 1 24 26 32 45 56 23 78 * 1 24 26 32 45 23 56 78 * 1 24 26 32 23 45 56 78 * 1 24 26 23 32 45 56 78 * 1 24 23 26 32 45 56 78 * 1 23 24 26 32 45 56 78 */
二分查找(折半查找):前提是在已经排好序的数组中,通过将待查找的元素与中间索引值对应的元素进行比较,若大于中间索引值对应的元素,去右半部分查找,否则,去左半部分查找,直到找到位置没找不到返回一个负数。
public class Test{ public static void main(String[] args){ //必须保证数列是有序的 int[] num ={10,20,50,65,88,90} int index = binarySearch(num,88) } public static int binarySearch(int[] num,int key){ int start =0; int end = num.length-1; while(start<=end){ int middle =(start+end)/2; if(num[middle]>key){ end=middle-1; }else if(num[middle]<key){ start = middle+1; }else{ return middle; } } return -1; } }
Arrays工具类:用来操作数组的各种方法
常用方法:
使用二分查找法
Arrays.binarySearch(int[] array,int value);
数组内容转成字符串的形式输出
Arrays.toString(int[] array);
数组排序
Arrays.sort(int[] array);
复制指定的数组
Arrays.copyOf(int[] array,int length);
Arrays.copyOf(int[] array,int from,int to);
System,arraycopy(Object src,int srcPos,Object dest,int desPos,int length)
判断两个数组是否相等
Arrays.equels();
使用指定元素填充数组
Arrays.fill();
public class Test{ public static void main(String[] args){ int[] nums = {1,45,32,24,26,56,78,23}; //二分查找 int index = Array.binarySearch(nums,88); System.out.println(index); } }
步骤:
用户选择是机选还是手选号码;
接收用户选号(6红,1蓝);
生成系统号码(6红,1蓝);
比较系统号码和用户号码,记录个数;
验证是否中奖;
系统号码排序;
公布结果;
import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class Test1 { public static void main(String[] args) { //定义相关的变量 int[] userRedBall = new int[6];//用户选择的红球号码 int[] sysRedBall = new int[6];//系统生成的红球号码 int userBlueBall = 0;//用户选择的蓝球 int sysBlueBall = 0;//系统生成的蓝球 int redCount = 0;//记录用户选择正确的红球数 int blueCount = 0;//记录用户选择正确的蓝球数 int[] redBall = new int[33];//用于存储1-33的红球号码 //需要随机生成6个在1-33之间不重复的数(算法) for(int i = 0;i<redBall.length;i++){ redBall[i] = i+1; } //游戏开始,系统提示 System.out.println("双色球游戏开始,good luck!"); System.out.println("请问你是要机选还是手选号码(1:机选,2:手选):"); Scanner input = new Scanner(System.in); Random r = new Random(); boolean flag = true; while (flag){ int isAuto = input.nextInt(); switch (isAuto){ case 1: //机选 computerSelection(redBall,userRedBall);//机选红球 userBlueBall=r.nextInt(16)+1;//机选蓝球 flag=false; break; case 2: //手选 System.out.println("请选择六个红球号码(1-33):"); for (int i=0;i<userRedBall.length;i++){ userRedBall[i] = input.nextInt(); } System.out.println("请选择一个蓝球号码(1-16):"); userBlueBall = input.nextInt(); flag=false; break; default: System.out.println("请请问你是要机选还是手选号码(1:机选,2:手选):"); break; } } //系统随机生成号码 //红球 computerSelection(redBall,sysRedBall); //蓝球 sysBlueBall=r.nextInt(16)+1; //统计结果: //统计红球 for (int i=0;i<userRedBall.length;i++){ for(int j=0;j<sysRedBall.length;j++){ if(userRedBall[i]==sysRedBall[j]){ int temp = sysRedBall[j]; sysRedBall[j] = sysRedBall[sysRedBall.length-1-redCount]; sysRedBall[sysRedBall.length-1-redCount]=temp; redCount++; } } } //统计蓝球 if(userBlueBall==sysBlueBall){ blueCount=1; } //验证是否中奖 if (blueCount==0 && redCount<=3){ System.out.println("革命尚未成功,同志还需努力!"); }else if(blueCount==1 && redCount<3){ System.out.println("中了六等奖,5块钱!"); }else if((blueCount==1 && redCount==3)||(blueCount==0 && redCount==4)){ System.out.println("中了五等奖,10块钱!"); }else if((blueCount==1 && redCount==4)||(blueCount==0 && redCount==5)){ System.out.println("中了四等奖,200块钱!"); }else if(blueCount==1 && redCount==5){ System.out.println("中了三等奖,3000块钱!"); }else if(blueCount==0 && redCount==6){ System.out.println("中了二等奖,150W!"); }else if(blueCount==1 && redCount==6){ System.out.println("中了一等奖,500W!"); }else{ System.out.println("系统有误,中奖无效!"); } //公布系统号码 System.out.println("本期中奖红球号码为:"); sort(sysRedBall); System.out.println(Arrays.toString(sysRedBall)); System.out.println("本期中奖的蓝球号码为:"+sysBlueBall); //公布用户号码 System.out.println("您选择的红球号码为:"); sort(userRedBall); System.out.println(Arrays.toString(userRedBall)); System.out.println("您选择的蓝球号码为:"+userBlueBall); System.out.println("买双色球,造福你我他,谢谢!"); } //冒泡排序 public static void sort(int[] ball){ for(int i=0;i<ball.length-1;i++){ for(int j=0;j<ball.length-1-i;j++){ if(ball[j]>ball[j+1]){ ball[j]=ball[j]+ball[j+1]; ball[j+1]=ball[j]-ball[j+1]; ball[j]=ball[j]-ball[j+1]; } } } } //用于在指定数列中,随机生成多个不重复的数的算法 public static void computerSelection(int[] redBall,int[] userRedBall){ Random r = new Random(); int index=-1; for(int i =0;i<userRedBall.length;i++){ index=r.nextInt(redBall.length-i); userRedBall[i] = redBall[index]; int temp = redBall[index]; redBall[index]=redBall[redBall.length-1-i]; redBall[redBall.length-1-i]=temp; } } }