方法&数组
课程介绍
-
- 方法 (重点)
-
- 修饰符(重点)
-
- 数组(一维数组(重点) 二维数组(了解))
1方法(函数)
1.1 概念
什么是方法呢?
定义:方法是可以看成是一个独立完成某个功能的一段代码
方法就是一个东西(把一个方法看成是一个成体,它拥有其功能,方法可以反复用)
示列:
写一段代码:完成计算1-10的和
int sum = 0;
for(int i=1;i\<=10;i++){
sum+=i;
}
同时要求:完成计算1-1000的和
int sum = 0;
for(int i=1;i\<=1000;i++){
sum+=i;
}
同时又要求:完成计算1-10000的和
int sum = 0;
for(int i=1;i\<=10000;i++){
sum+=i;
}
同时要求:。。。。。。。。。。
思考:上面的代码,就只有一个数字进行改变了,其他都没变,可以写一个通用的代码吗?我只要用就可以完成所有的求和?
–》用方法可以办到
常见错误
原因:形参与实参不匹配,我们应该在调用方传递与形参相同的个数与格式
正确写法
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/986dab96a0a38dd84001f886fbb01228.png)
2.2 方法的基本语法与结构
①语法结构:
修饰符 返回值类型 方法名(变量1,变量2){
方法体
}
②调用方法的时候,形参必须要与实参一致
③方法签名:方法名+参数列表
④一个类中不能有两个同样的方法签名(注意不是方法名,是方法签名)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/37b144c65624a190d0ede51cafee590a.png)
2.3 方法的返回值类型
方法何时需要返回一个数据(如果你需要返回就返回)–》目前设计一个方法就要思考一下需不需要返回
列如:计算二个数据的和(希望得到返回值),应该返回
不需要返回的示列:
注意:
①如果返回值是void类型,内部不需要(也不能)return 一个值
②如果方法返回值是void类型,是不能直接打印与接收的
③只要返回值类型是一个void,那么不管什么情况都必须返回一个值
编译器只看结构,不看结果(若if语句成立即可,若不成立呢)
For语句也是有判断的,若不满足呢
2.4 方法重载
在同一个类中,名字相同,但是参数列表不同
好处:我们只需要记一个方法add表示可以求多个整数的和
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/253d036a5fbbf09ae12de0099367328f.png)
2.访问修饰符
java的四个关键字:public、protected、default、private(他们决定了紧跟其后被定义的东西可以被谁使用)
3.数组(一维数组)
为什么要学习数组
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f5a0cb41db86805eefc183c832bf66b6.png)
原因:变量只能存储1个值,而我们怎么解决呢?用数组(可以存放多个数据)
3.1 什么是数组
数组:一个数组可以看成是一个容器,它可以存储多个数据
3.2 数组有什么作用–存储数据的
3.3如何使用数组
场景:
现在有一堆数据:各位的年龄19 20 32 11 55 66…
希望使用一个数组存储起来
①数组的创建
申明数组
> 语法: 数组类型[] 数组名; 或者 数组类型 数组名[]
> 示列: int[] ages;//定义一个数组变量
创建数组
> 动态创建方式
> Int[] ages = new int[5];
> 或者
> Int[] ages;
> ages = new int[5]
> 静态创建方式
> Int[] ages = new int[]{12,33,11};
> 或者
> Int[] ages = {12,33,11}
> 但是下面是错误的方式
> Int ages;
> Ages = {12,33}
②把数据装进去
Int[] ages = new int[5];
ages[0] = 10;//把10放入ages数组中第一个格子
ages[1] = 20;
③使用,把数据取出来
取出数据直接打印
取出数据做运算
取出数据作为实际参数进行传递
4.二维数组[了解]
1.定义几个数组
int [] a = {11,22,33};
int [] b = {11,22,33,55,66};
int [] c = {1,3};
数组声明的语法: 数组中元素类型[] 数组名;
2.上面的 a b c分别把它们看成一个整体
a 的类型是:int []
b 的类型是:int []
c 的类型是:int []
3.希望定义一个长度为3的数组,来存储上面的a b c
int [] [] arr = {a,b,c};
int [] [] arr = new int[] []{a,b,c};
4.1什么是二维数组
上面这个就是二维数组,为什么称之为2维数组?
只是数组中存储元素类型是任意的,包括了数组类型。
思考:上面代码中二维数组arr的length是多少?
4.2二维数组创建
二维数组的动态创建方式
int [] [] array = new int[][];//声明一个二维数组,a中的元素类型 int[] 一共有3个
1.打印a[0]
打印a中的第一个元素(第一个一维数组)
2.修改上面动态创建的二维数组 创建格式
int [] [] a = new int[3][5];
使用for循环可遍历二维数组
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b657f84b8e698dd51d52352af214d425.png)
4.3堆栈内存图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d3a3f5426f5a52c93fffa716c2fa55bc.png)
4.4根据指定格式打印数组
设计一个方法,打印传入int一维数组中的所有元素,打印的格式:[11,22,44,55]
-
定义一个方法print,方法参数修改为int 数组(变量名为arr)
-
方法里 使用 for循环 遍历数组,使用System.out.println打印
-
main方法里创建一个数组,然后调用方法print方法
-
打印结果换行了,但是我们要求打印一行,所以使用System.out.print
-
但是我们要求打印用 逗号 分割,所以System.out.print(arr[i]+”,”)
-
前后要求还有个 中括号,所以我们加上打印 [ 和 ]
-
注意:角标越界的问题
方式1:直接打印
方式2:使用字符串拼接
上面的方法打印了多次,先把需要打印的内容拼接成一个字符串,拼接完毕之后一次性打印
-
修改上面的代码
-
打印的内容拼接成字符串,先定义一个字符串str
-
修改用str拼接打印结果
设计一个方法,不打印数组,而是把打印的结果返回
返回数组的字符串表示形式: [11,22,44,55]
-
返回类型修改为String
-
在main 方法调用
-
用一个字符串变量接收下print的返回结果
4.5排序(了解)
引入
比如双色球彩票开奖号码:
- 现在有一个数组:
希望写一段代码:执行完毕之后,上面的数组中的数据变成从小到大的排序,怎么写?
-
观察手动排序,如果数据量太大,数据值也比较大,就很难去比较大小了
-
希望有一个严谨的比较规则:先相邻的两个格子进行比较,把较大的放在靠后的位置
-
代码实现
-
第一轮比较5次,把最大的数放到最后
//第一次
if(a[0] \> a[1]){
int t = a[0];
a[0] = a[1];
a[1] = t;
}
//第二次
if(a[1] \> a[2]){
int t = a[1];
a[1] = a[2];
a[2] = t;
}
//第三次
//第四次
//第五次
优化上面代码,使用for 循环
(第一轮 把最大的数 移动到最后面呢)
第二轮比较4次,把最大的数放到最后
第三轮比较3次,把最大的数放到最后
第四轮比较2次,把最大的数放到最后
第五轮比较1次,把最大的数放到最后
优化上面代码,使用嵌套循环
- 上面的代码只能排列数组长度为 6 的数组,我们希望是任意数组的长度怎么做
数组变量.length
这就是 冒泡排序
4.6二分搜索(了解)
示例:查询一个整数在整型数组中第一次出现的位置
11,22,33,44,56,78
-
定义一个方法search,循环找到第一次出现的元素索引
-
二分查找
前提: 被查找的数组中的元素必须是有序的
-
定义一个方法,名字为binarySearch(int ele,int[] src)
-
先查找数组中间位置(索引)出的元素和ele比较
-
定义三个变量
最小索引 minIndex
最大索引maxIndex
中间索引 (minIndex + maxIndex) / 2
- 比较判断确定范围
if( ele < src[midIndex] ){
maxIndex = midIndex -1;
}else if(ele > src[midIndex]){
minIndex = midIndex + 1;
}else{
return midIndex;
}
public static int binarySearch(int ele,int[] src){
int minIndex = 0;//起始索引
int maxIndex = src.length-1;//结束索引
int midIndex = (minIndex + maxIndex)/2;//中间索引
//循环不断缩小搜索区间
while(minIndex <= maxIndex){
if( ele < src[midIndex] ){
maxIndex = midIndex -1;
}else if(
ele > src[midIndex]){
minIndex = midIndex + 1;
}else{
return midIndex;
}
midIndex = ( minIndex + maxIndex )/2;
}
return -1;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2cc7d29c02d72e6a2850680ead0410b6.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a3af9fc98b652d1bce45bca2b73004ba.png)
5.增强for循环 foreach
5.1 foreach作用
作用: 主要是用来遍历数组和集合的;
缺点: 没有索引,凡是涉及有索引相关操作还是用普通for循环,
5.2语法结构
> for(源中元素类型 e : 源 ){
> 直接使用e就可以了
> }
> 源 : 可以是数组或者集合(Iterable接口的实现类)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4724b8ff131f1437239317bdb171e785.png)
5.3遍历二维数组
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8362bde3fdba7bbfee0a1738abdf9f6d.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/90e362011f001ae4e8c3a9cb36d62f4b.png)
6.可变参数 int…
1回顾 求两个整数的和,求三个整数的和 这样的方法 ;
2转变方式 如果求多个整数的和?–使用数组
3.引入可变参数
① 一个方法 可以有可变参数和普通参数,但是可变参数必须放到参数列表的最后;
② 一个方法 不能有多个可变参数;
7. 课程总结
7.1 重点
-
方法(重中之重)
-
数组(一维数组)
-
foreach
7.2 难点
方法的定义,和返回值(多去看,多去想,多去练)
8.课后练习
1.定义一个方法getMax,接收两个int参数,返回最大的一个数
public int getMax(int a,int b) {
if(a\>b) {
return a;
}else {
return b;
}
}
2.定义一个方法,接收三个int参数,返回最小的一个数
public static int getMin(int a,int b,int c) {
if(a\<b) {
if(a\<c) {
return a;
}else{
return c;
}
}else if(b\<c) {
return b;
}else {
return c;
}
}
3.设计一个求多个整数积的方法
public static int getMore(int...arr) {
int sum = 1;
for(int i:arr) {
sum\*=i;
}
return sum;
}
4.设计一个方法,查询并返回一个字符在字符数组中第一次出现的位置
public static int getOne(char a,char...arr) {
int s = 0;
for(int i=0;i\<arr.length;i++) {
if(arr[i]==a) {
break;
}else {
s++;
}
}
return s;
}
5.设计一个方法,统计一个字符在字符数组中出现的次数
public static int getTwo(char a,char...arr) {
int s = 0;
for(int i=0;i\<arr.length;i++) {
if(arr[i]==a) {
s++;
}
}
return s;
}
6.已知这样的整形数组 int[] arr = {1,2,3,4,5,6,7,8,9,11,12}计算出其中的奇数和
public static int getThree(int...arr) {
int sum=0;
for(int i =0;i\<arr.length;i++) {
if(arr[i]%2==1) {
sum+=arr[i];
}
}
return sum;
}
7.现在有数组 double[] scores ={11,34,76,77,88,99,58,97,56};定义一个方法统计并打印出每一个阶段学生人数(分段方式:0-60;60-80;80-100)
public static void getFour(double...arr) {
int a=0;
int b=0;
int c=0;
for(int i=0;i\<arr.length;i++) {
if(arr[i]\>=80) {
a++;
}else if(arr[i]\>=60) {
b++;
}else {
c++;
}
}
System.out.println("0\~60的人有:"+c);
System.out.println("60\~80的人有:"+b);
System.out.println("80\~100的人有:"+a);
}
8.设计一个方法,传入一个int的数组,返回该数组中最大的值
public static int getFive(int...arr) {
int max=0;
for(int i =0;i\<arr.length-1;i++) {
max = arr[i];
if(max\<arr[i+1]) {
max=arr[i+1];
}
}
return max;
}
9.设计一个方法,传入一个int的数组,返回该数组中最小的值
public static int getSix(int...arr) {
int min=0;
for(int i =0;i\<arr.length-1;i++) {
min = arr[i];
if(min\>arr[i+1]) {
min=arr[i+1];
}
}
return min;
}