多维数组的使用:
练习1:
package com.atguigu.exer;
public class ArrayExer1 {
public static void main(String[] args) {
//具体问题具体分析,静态初始化只需一行搞定
int[][] arr =new int[][]{{3,5,8},{12,9},{7,0,6,4}};
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); //54
}
}
练习2:
注意有坑( int[ ] x,y[ ]; ):
int[ ] x,y[ ]; 相当于:int[ ] x;int[ ] y[ ];
所以x为一维数组,y为二维数组。
练习3:
package com.atguigu.exer;
public class YangHuiTest {
public static void main(String[] args) {
//1,声明并初始化二维数组(动态初始化)
int[][] yangHui=new int[10][]; //后面的[]内不写值,因为每列元素个数都不一样
//2,给数组元素赋值
for(int i=0;i<yangHui.length;i++){
yangHui[i]=new int[i+1]; //表示第一行只有 一个元素(int[1]数组长度为一)
//2.1给首末元素赋值
yangHui[i][0]=1;
yangHui[i][i]=1;
//2.2给每行的非首末元素赋值
if(i>=2){ //if去掉依然成立,i=0,i=1进不去循环
for(int j=1;j<yangHui[i].length-1;j++){ //范围从第二个元素开始到倒数第二个元素结束
yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
}
}
}
//3,遍历二维数组
for(int i=0;i<yangHui.length;i++){
for(int j=0;j<yangHui[i].length;j++){
System.out.print(yangHui[i][j]+" ");
}
System.out.println();
}
}
}
红色标注为面试常考题型:
面试题:
①
/*面试题目:创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同*/
package com.atguigu.exer;
public class ArrayRan {
public static void main(String[] args) {
int[] arr=new int[6];
for(int i=0;i<arr.length;i++){
arr[i]=(int) (Math.random()*30)+1; //赋值
boolean flag=false; //标志
while(true){
//i=0时不进入循环,第一个数不用怕和前面重复
for(int j=0;j<i;j++){
if(arr[i]==arr[j]){
flag=true;
break; //for循环出口
}
}
if(flag){
arr[i]=(int) (Math.random()*30)+1;
flag=false; //重置,用于下次循环
continue; //结束当次while循环
}
break; //while循环出口,执行此句表明后面赋值与前面不相等
}
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
补充知识——如何获取一个1-30的随机整数:
Math.random()取值[0.0,1.0);
注意此处乘以30范围变为[0.0,30.0)
再加一,范围变为[1.0,31.0),
arr[i]=(int) (Math.random()*30)+1;
进行强制类型转换刚好转为1-30的整数。
②
/* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
要求:所有随机数都是两位数。*/
package com.atguigu.exer;
public class ArrayNumber {
public static void main(String[] args) {
//定义数组
int[] arr=new int[10];
//赋值
for(int i=0;i<arr.length;i++){
arr[i]=(int)(Math.random()*90+10);
}
//遍历输出,看一下生成的随机数
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
//求最大值
int maxValue=arr[0]; //若使maxValue=0有负数时会出错
for(int i=0;i<arr.length;i++){
if(arr[i]>maxValue){
maxValue=arr[i];
}
}
System.out.println("最大值为:"+maxValue);
//求最小值
int minValue=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]<minValue){
minValue=arr[i];
}
}
System.out.println("最小值为:"+minValue);
//求和值
int sum=0; //此处可以赋值为0,求和,有负数也不会出错
for(int i=0;i<arr.length;i++){
sum+=arr[i];
}
System.out.println("总和为:"+sum);
//求平均值
double avgValue=sum/arr.length;
System.out.println("均值为:"+avgValue);
}
}
③
package com.atguigu.exer;
//)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组
public class ArrayTest {
public static void main(String[] args) {
int[] array1,array2;
//使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
array1=new int[]{2,3,5,7,11,13,17,19};
//显示array1的内容。
for(int i=0;i<array1.length;i++){
System.out.print(array1[i]+"\t"); //输出在一行内以空格隔开
}
//赋值
array2=array1;
//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。
for(int i=0;i<array2.length;i=i+2){
if(i%2==0){
array2[i]=i;
}
}
System.out.println(); //换行
//打印出array1。
for(int i=0;i<array1.length;i++){
System.out.print(array1[i]+"\t");
}
}
}
运行结果:
修改array2后array1发生了变化。原因如下:
其中 array2=array1; 不能称之为数组的复制,它类似给计算机中一个文件创建了一个快捷方式。
array1和array2地址值相同,都指向堆空间中唯一一个数组实体。
思考如何实现array2对array1数组的复制
如下才是真正的复制操作:
package com.atguigu.exer;
public class ArrayTest1 {
public static void main(String[] args) {
int[] array1,array2;
array1=new int[]{2,3,5,7,11,13,17,19};
for(int i=0;i<array1.length;i++){
System.out.print(array1[i]+"\t");
}
//这才是数组的复制
array2=new int[array1.length];
for(int i=0;i<array2.length;i++){
array2[i]=array1[i];
}
for(int i=0;i<array2.length;i=i+2){
if(i%2==0){
array2[i]=i;
}
}
System.out.println();
for(int i=0;i<array1.length;i++){
System.out.print(array1[i]+"\t");
}
}
}
算法的考察
数组的复制、反转、查找(线性查找、二分法查找)
//数组的复制、反转、查找(线性查找、二分法查找)
package com.atguigu.exer;
public class Arraytestpro {
public static void main(String[] args) {
String[] arr=new String[]{"jd","dj","mm","gg","AA","Bb"};
//数组的复制(区别于arr1=arr2)
String[] arr1=new String[arr.length];
for(int i=0;i<arr.length;i++){
arr1[i]=arr[i];
System.out.print(arr1[i]+"\t");
}
System.out.println();
//数组的反转
//方法一:
// for(int i=0;i<arr.length/2;i++){ //注意循环条件,6个数到索引为2结束即可完成反转,若不除2相当于反转两次又复原了
// String temp=arr[i]; //定义中间变量
// arr[i]=arr[arr.length-i-1];
// arr[arr.length-i-1]=temp;
// }
//方法二:
for(int i=0,j=arr.length-1;i<j;i++,j--){ //i=j时不用操作(自己跟自己换没意思)
String temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
for(int i=0;i<arr.length;i++){ //遍历
System.out.print(arr[i]+"\t");
}
System.out.println();
//数组的查找(搜索)
//1,线性查找
boolean isFlag=true; //技巧:引入标志
String dest="Bb";
for(int i=0;i<arr.length;i++){
if(dest.equals(arr[i])){ //字符串不可以用==,使用equals---比较内容是否相等
System.out.println("找到了,位置为:"+i);
isFlag=false;
break;
}
}
if(isFlag){
System.out.println("找不到哦");
}
//,二分法查找(折半查找) 前提:所要查找的数组必须有序
int[] arr2=new int[]{-98,-34,2,34,54,66,79,105,210,333};
int dest1=34;
int head=0; //初始的首索引
int end=arr2.length-1; //初始的尾索引
boolean isFloat1=true;
while(head<=end){ //条件不满足,结束循环
int middle=(head+end)/2;
if(dest1==arr2[middle]){
System.out.println("找到了指定元素,位置为:"+middle);
isFloat1=false;
break; //找到元素,结束循环
}else if(arr2[middle]>dest1){
end=middle-1;
}else{ //arr2[middle]>dest1
head=middle+1;
}
}
if(isFloat1){ //没有找到
System.out.println("找不到哦");
}
}
}