数组
选择排序:从0下标开始,依次和后面每个元素比较,小的往前放,第一次完毕,最小值出现在了最小下标处
案例:
//1.用选择排序将数组中的最小值选出
public static void main(String[] args) {
int[] ary = {12,4,54,7,3,8,35,88};
//用一次选择排序,将最小值放到下标0处
for(int i=1;i<ary.length;i++){
//两个数的交换
if(ary[i]<ary[0]){
int tmp = ary[0];
ary[0] = ary[i];
ary[i] = tmp;
}
}
System.out.println(Arrays.toString(ary));
}
2.对一个数组进行升序排列
public static void main(String[] args) {
int[] ary = {12,4,54,7,3,8,35,88};
//i:被比较数的下标
for(int i=0;i<ary.length-1;i++){
//实现将此为的最小值排出
//j:比较数的下标
for(int j=i+1;j<ary.length;j++){
//实现比较
if(ary[i]>ary[j]){
int tmp = ary[i];
ary[i] = ary[j];
ary[j] = tmp;
}
}
}
System.out.println(Arrays.toString(ary));
3.Arrays.sort():
Sort():如果数组的元素类型是基本数据类型:那么这个sort方法底层采用的是经过优化的快速排序算法,如果数组的元素类型是引用类型,此时sort方法底层采用的算法是优化的合并排序算法。–(了解性内容,不要求掌握)
2.方法
各种语言都有方法的概念(有的语言称其为函数或过程)
方法用于封装一段特定的逻辑功能
方法可以在程序中反复被调用;
方法可减少代码重复,便于程序的维护。
方法:将一段具有特定功能的代码进行封装,以便可以多次调用,提高了代码的复用率
1.方法的定义:5部分
修饰符,返回值类型,方法名,参数列表,方法体
修饰符:访问控制修饰符
- 方法名:命名规则:驼峰命名法
a) 首字母小写的 - 返回值:
写一个方法,方法体如果最后要将一个结果返回,此时就说方法有返回值,那么返回值类型位置必须放一个数组类型(和返回的结果的类型保持一致)
–return 表达式/变量/数值;
如果一个方法没有返回值,此时返回值类型位置写void
- 参数列表:
a) 方法名(参数列表)
参数列表:可以是0个,可以是1个,还可以是多个
形参:在定义方法的时候参数列表位置定义出的变量
实参:在调用方法的时候必须传递的具体的值
5局部变量的生命周期
如果一个变量定义在一个方法的内部,那么这个变量就叫做局部变量,作用范围紧邻它的一堆{}
局部变量的生命周期:
随着方法体中变量的定义而产生,直到方法结束,局部变量从内存销毁
Public void getMaxValue(){
int a = 3;
int b = 13;
int sum = a+b;
int product = a*b;
…..
}
Public void getMaxValue(int a,int b){
//a b 是局部变量
…..
}
6成员变量:
在java中,如果一个变量定义在方法的外部,类的内部,那么这个变量就叫做成员变量。
比较:
局部变量在使用之前必须进行初始化、、
成员变量会被默认初始化
int ax ;
默认初始化的值和类型有关:
整数数值 0
浮点类型 0.0
Boolean false
Char \u0000 0
引用类型: null
7可变参数:
语法:
数据类型…变量名
int…is
可变参数:个数可变的参数
注意点:
1. 如果参数列表有多个参数,那么可变参数一定是位于参数列表的最后,参数列表中最多只能有一个可变参数
a) test(int a,int…is) //正确的
b) test(int…is,int a) //错误的
2.底层采用的数组
3.如果方法的参数是可变参数,那么传递的实参可以是一个数组
可变参数的访问
- 案例:
用户输入两个数字,对两个数字求和
public static void main(String[] args) {
//用户从控制台输入两个整数
Scanner sc = new Scanner(System.in);
System.out.println(“请输入两个整数,用空格隔开”);
int a = sc.nextInt();
int b = sc.nextInt();//对输入的ab求和
int sum = sum(a,b);
System.out.println(a+”+”+b+”=”+sum);sc.close();
}
public static int sum(int x,int y){
//对x y求和
return x+y;
}用户输入两个数字,求出最大值
public static void main(String[] args) {
//用户输入两个整数
Scanner sc = new Scanner(System.in);
System.out.println(“请输入两个整数,用空格隔开”);
int a = sc.nextInt();
int b = sc.nextInt();//找出二者中的最大值
int max = getMaxValue(a,b);
System.out.println(a+”和”+b+”中的最大值是:”+max);
sc.close();
}
public static int getMaxValue(int a, int b) {
//方法体:找出二者中的最大值
return a>b?a:b;
}
3.猜字母游戏
其游戏规则为:程序随机产生5个按照一定顺序排列的字符作为猜测的结果(不重复),由玩家来猜测此字符串。玩家可以猜测多次,每猜测一次,则由系统提示结果。如果猜测的完全正确,则游戏结束,计算玩家的游戏得分并输出(每次字符100分,猜错一次扣10分);如果没有猜对,则提示猜测的结果,如猜对了几个字符,以及猜对了几个字符的位置等信息,并提示玩家游戏继续。 — EXIT,退出程序
/*
* 猜字母游戏
*/
public class GuessLettersGame {
public static void main(String[] args) {
int score = 0,count=0;
System.out.println("欢迎进入猜字母游戏:");
char[] dest = generate();
System.out.println(Arrays.toString(dest));
Scanner sc = new Scanner(System.in);
//用户输入字符串
while(true){
String input = sc.next().toUpperCase();
//对输入的内容进行判断
if("EXIT".equals(input)){
System.out.println("退出程序");
break;
}
//将输入的字符串转换为字符数组
char[] inputArray = input.toCharArray();
//判断输入的字符数组的长度是否为5
if(inputArray.length!=5){
System.out.println("输入的字符个数必须为5!");
count++;
continue;
}
//检查
int[] result = check(inputArray,dest);
if(result[1]==dest.length){
score = 100*dest.length-10*count;
//全都猜对了
System.out.println("恭喜你,猜对了,得分是:"+score
);
break;
}else{
System.out.println("猜对的字符个数是:"
+result[0]+",其中位置正确的字符个数是:"+result[1]);
count++;
}
}
sc.close();
}
//随机生成长度为5的字符数组
public static char[] generate(){
char[] letters = {'A','B','C','D','E','F','G',
'H','I'}; //9个字符
char[] chs = new char[5];
boolean[] flag = new boolean[9];
//为chs中的每个元素随机生成
for(int i=0;i<chs.length;i++){
int index;
do{
index = (int)(Math.random()*9);
}while(flag[index]);
chs[i] = letters[index];
//flag[index] = true;
}
return chs;
}
//检查用户输入的字符数组是否和生成的内容匹配
public static int[] check(char[] inputArray,char[] dest){
//inputArray和dest比较
//i:inputArray中的下标
int[] result = new int[2];
for(int i=0;i<inputArray.length;i++){
//和dest中的每个值进行比较
for(int j=0;j<dest.length;j++){
if(inputArray[i]==dest[j]){
//输入的字符中一个猜对了
result[0]++; //result[0] :猜对的字符个数
//位置匹配判断
if(i==j){
//位置正确
result[1]++; //result[1]:位置正确的字符个数
}
break;
}
}
}
return result;
}
String 字符串本质是字符数组
abcde
整体脉络:
1. genarate() – 生成标准的字符数组 A-Z 5个不重复字符
2. 用户输入字符串— 循环 do..while while(true)
a) 将输入的字符串转换为大写
i. String.toUpperCase();
b) 对输入的字符串进行是否为exit判断
i. String .equals(String) - boolean – 判断字符串内容是否相同
3. Check(char[] input,char[] standard) – 对用户输入的字符串和标准字符数组进行比较
4. 根据check的结果判断出是猜对了,还是猜错了
总结:
方法:
定义:5部分
修饰符 返回值类型 方法名(参数列表){
方法体
}
返回值类型:
return 表达式/变量/值;
方法如果没有返回值,那么写void
参数列表:方法名(参数列表)
可以放0个参数,也可以放多个
形参,实参
方法的参数列表位置的参数其实是局部变量
、
成员变量:可以只声明,java会对其进行默认初始化,初始化的值和数据类型有关系
局部变量:局部变量的生命周期
、
可变参数:数据类型…变量名;
注意点:
1. 如果参数列表中有可变参数,那么可变参数一定位于列表的最后
2. 本质其实是数组 — 可变参数的访问方式和数组一样
3. 因为可变参数底层是用数组保存数据的,所以在调用某个有可变参数的方法时,可以传递一个数组
5.作业
为猜字母游戏添加等级。等级设为三个等级:5,7,9,代表所需要猜测的字母个数。游戏开始时,由玩家选择游戏等级(5,7,9).如果选择7,则会随机产生7个字符,然后玩家输入一个字符串包含7个字符,看这7个字符和随机产生的7个字符比较,是否正确,并统计分数。另外,如果输入其他,重新提示输入游戏等级。