1、赋值
两种赋值方法
静态初始化:直接一开始就把数组的内容定义了
动态初始化:先开辟空间,然后后面再赋值,可以不全部赋值(此时没有赋值的就是初始值,例如0、null)
// 声明
int[] ids;
//1.1静态初始化;数组的初始化和数组元素的幅值操作同时进行。
ids = new int[]{100,100,1002,1003};//引用数据类型,所以需要有new
//1.2动态初始化
//数组的初始化和数组元素的幅值操作.分开.进行
String[] names = new String[6]; //names不需要像上面的ids一样声明?
// 后面再赋值
names[0] = "asd";
names[1] = "miracleli";
/* 试一试赋值一些,不完全都赋值了。
names[2] = "阿萨德";
names[3] = "213e";
names[4] = "qwe";
*/
2、遍历
就是for循环不断System.out.println();
for(int i=0; i<ids.length;i++)
{
System.out.println(ids[i]);
}
数组的查找、赋值、翻转、排序
1. 数组元素的赋值(杨辉三角、回形数等)
杨辉三角:
输出前十行
package com.atguigu.java;
public class YangHuiSanJiao {
public static void main(String[] args) {
int[][] arr = new int[10][];
arr[0] = new int[]{1};
arr[1] = new int[]{1,1};
for(int i = 2;i<arr.length;i++)
{
arr[i] = new int[i+1];
arr[i][0] = 1;
arr[i][i]=1;
for(int j = 1;j<arr[i].length-1;j++)
{
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
}
}
for(int i = 0;i<arr.length;i++)
{
for(int j = 0;j<arr[i].length;j++)
{
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
2. 求数值型数组中元素的最大值、最小值、平均数、总和等
package com.atguigu.exer;
/*
*
* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值, 最小值,和值, 平均值, 并输出出来。
要求: 所有随机数都是两位数。[10,99]
Math.random()的取值范围是[0,1)
*/
public class ArrayExer1 {
public static void main(String[] args) {
int[] arr = new int[10];
int all=0;
double avg = 0.0;
for(int i=0; i<arr.length;i++)
{
arr[i] = (int)(Math.random()*(99-10+1)+10); //强制类型转换要用括号括起来(int)
all += arr[i];
System.out.print(arr[i]+"\t");
}
//平均值
avg = (double)all/arr.length;
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++)
{
if(arr[i]<min)
{
min = arr[i];
}
else if(arr[i]>max)
{
max = arr[i];
}
}
System.out.println("和值为:"+all);
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
System.out.println("平均值为:"+avg);
}
}
3. 数组的复制、反转、查找(线性查找、二分法查找)
- 复制(区别于数组变量的赋值)
// 数组的复制
for(int i = 0;i<array2.length;i++)
{
array2[i] = array1[i];
}
如果是array2 = array1;
此时array2如果print出来,和array1是一样的,但是,如果修改array2,那么array1中的值也会变。原因在于array2 = array1;会使得array2存放了与array1相同的内存地址,这两个变量指向了同一个内存空间,只要改变其中一个,那么另一个也会改变。通常这样做的来进行赋值的时候,很容易后续修改array2而导致array1也发生变化,而此时又不报错,很难拍出问题所在。所以一般是通过for循环来赋值。
- 反转
反转就是把数组的前后元素对调,反过来,得到一个新的布局
String[] arr = new String[]{"AA","BB","MM","GG","DD","xx"};
//使用临时变量
for(int i =0;i<arr.length/2;i++) //这里要除以2
{
String temp = arr[i]; //这里不是String数组,所以不需要new。
arr[i] = arr[(arr.length-1)-i]; //这里要注意减1,因为第一个是0,最后一个是arr.length-1
arr[(arr.length-1)-i] = temp;
}
反转结果如下:正确
- 查找/搜索(线性、二分法)
- 线性查找(地毯式搜索)
// 线性查找
String[] arr = new String[]{"AA","BB","MM","GG","DD","xx"};
String dest = "BB";
boolean isfalg = false;
for(int i = 0;i<arr.length;i++)
{
if(dest.equals(arr[i]))
{
System.out.println("找到了指定元素,位置为:"+i);
isfalg = true;
break;
}
}
if(isfalg)
{
System.out.println("没找到");
}
- 二分查找
必须是有序数组才能用二分法查找。何为有序数组?[1,2,3,4,5,6]以及[7,6,4,3,2,1]就是有序数组。[1,3,1,4,5,2]就不是有序数组。就是说数组内的元素值是从小到大或者从大到小排列的就可以用二分查找。
具体算法:
//二分查找
// 索要查找的数组必须有序(从小到大或者从大到小排列的)
int[] arr2 = new int[]{-123,-43,-22,-3,33,52,91,232,};
int dest1 = 33;
int head = 0; //初始首索引
int end = arr2.length-1;//初始的末索引
boolean isFlag = false;
while(head<=end)
{
int middle = (head+end)/2;
if(arr2[middle] == dest1)
{
System.out.println("找到了指定的元素,位置为:"+middle);
isFlag = true;
break;
}
else if(arr2[middle]<dest1)
{
head = middle+1;
}
else
{
end = middle-1;
}
}
if(!isFlag)
{
System.out.println("未找到指定元素");
}
4. 数组元素的排序算法
有些时候为了查找更快一些,需要使用二分法,而二分法只能对有序数据进行使用,所以就得先进行排序。
排序算法的题目待后续更新
十大内部排序算法
实现思想必须知道,java都封装好了,但是最基本的还是要能够手写
冒泡:
快速排序,思想要搞懂,每次能把一个元素排到他最终的位置上,并且数组的长度分成两段,不断分类
不清楚的额时候就举例子看一下,找下规律。
不是说哪种就是最好的,有适用的情况。