数组是一个固定长度的,包含了相同类型数据的 容器
int[] a; 声明了一个数组变量,仅声明没创建
创建数组的时候,要指明数组的长度。new int[5];
数组下标从0开始,下标0,代表数组里的第一个数
.length属性用于访问一个数组的长度,数组访问下标范围是0到(长度-1),一旦超过这个范围,就会产生数组下标越界异常
//先创建,后赋值
int[] a = new int[5];
a[0] = 1;
//创建的同时赋值,两种写法
int[] a1 = new int[]{1,2,3,4};
int[] a2 = {1,2,3,4,5};
for each循环遍历数组
int[] a2 = {1,2,3,4,5};
for (int i:a2) {
System.out.println(i);
}
数组作为方法的参数
public static void meth(int[] i){
System.out.println(Arrays.toString(i));
}
数组做为返回值
public static int[] meth(int[] a){
int[] a1 = new int[a.length];
for (int i = 0; i < a.length ; i++) {
a1[i] = a[i]+10;
}
return a1;
}
二维数组里面的每一个元素,都是一个一维数组,所以二维数组又叫数组的数组
int[][] a = new int[2][3];
a[1][2] = 5;
Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能。 大大提高了开发人员的工作效率。
类里面为static的方法可以直接类名调用,
int[] a = new int[5];
Arrays.toString(a);//转换字符串
Arrays.copyOfRange(a, "0", "3")//复制数组
Arrays.toString(a)//数组排序
Arrays.binarySearch(a, 62)//搜索62在a数组中的位置,使用前必须给数组排序
Arrays.equals(a, b)//比较两个数组的内容是否一样
Arrays.fill(a, 5)//使用5填充数组
选择排序,把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来比较完后,第一位就是最小的然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个位置来比较完后,第二位就是第二小的,依次类推
import java.util.Arrays;
/***
* 选择排序
*/
public class Exercise {
public static void main(String[] args) {
int[] array = new int[5] ;
for (int i = 0; i < array.length-1; i++) {
int rdom = (int) (Math.random() * 100);
array[i] = rdom;
}
System.out.println("原数组"+Arrays.toString(array));
int[] array2 = sort(array);
System.out.println("排序后"+Arrays.toString(array2));
}
public static int[] sort(int[] a){
int temp;
for (int i = 0; i < a.length-1 ; i++) {
//后一次进入大循环比较的循环往后推移一个元素,所以j = i+1
for (int j = i+1; j < a.length ; j++) {
if(a[i] > a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
return a;
}
}
冒泡排序,第一步:从第一位开始,把相邻两位进行比较如果发现前面的比后面的大,就把大的数据交换在后面,循环比较完毕后,最后一位就是最大的第二步: 再来一次,只不过不用比较最后一位
import java.util.Arrays;
/***
* 冒泡排序
*/
public class Exercise {
public static void main(String[] args) {
int[] array = new int[5] ;
for (int i = 0; i < array.length-1; i++) {
int rdom = (int) (Math.random() * 100);
array[i] = rdom;
}
System.out.println("原数组"+Arrays.toString(array));
int[] array2 = sort(array);
System.out.println("排序后"+Arrays.toString(array2));
}
public static int[] sort(int[] a){
int temp;
for (int i = 0; i < a.length-1 ; i++) {
for (int j = 0; j < a.length-1-i ; j++) {
if(a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
System.out.println("显示每一步"+Arrays.toString(a));
}
}
}
return a;
}
}
保存一个二维数组时,如果里面很多默认值为零或同一个值,因此记录了很多没有意义的数,使用稀疏数组可以解决这个问题
稀疏数组的处理方式
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
import java.util.Arrays;
/***
* 稀疏数组
*
*
* | 原数组行数 | 原数组列数 | 原数组有效数值个数
* |------------|-------------|-------------
* |有效值1所在行 | 有效值1所在列 | 有效值1的值
* |有效值2所在行 | 有效值2所在列 | 有效值2的值
* |有效值3所在行 | 有效值3所在列 | 有效值3的值
* |有效值4所在行 | 有效值4所在列 | 有效值4的值
* |有效值5所在行 | 有效值5所在列 | 有效值5的值
*
*/
public class Exercise {
public static void main(String[] args) {
int[][] array = new int[10][11];
array[8][8] = -6;
array[2][9] = 5;
array[6][2] = 18;
array[7][3] = 8;
array[9][2] = 3;
array[4][1] = 6;
System.out.println("原数组");
printArray(array);
int[][] array1 = compressArray(array);
System.out.println("压缩后的数组");
printArray(array1);
int[][] array2 = uncompressArray(array1);
System.out.println("解压后的数组");
printArray(array2);
}
public static int[][] compressArray(int[][] a) {
//获取原数组有效数值的个数
int sum = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
if (a[i][j] != 0) {
sum++;
}
}
}
int[][] array = new int[sum + 1][3];
array[0][0] = a.length;
array[0][1] = a[0].length;
array[0][2] = sum;
int k = 1;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
if (a[i][j] != 0) {
array[k][0] = i;
array[k][1] = j;
array[k][2] = a[i][j];
k++;
}
}
}
return array;
}
public static int[][] uncompressArray(int[][] a) {
int[][] array = new int[a[0][0]][a[0][1]];
int k = 1 ;
for (int i = 1; i <a.length ; i++) {
array[a[i][0]][a[i][1]] = a[i][2];
}
return array;
}
public static void printArray(int[][] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
首先创建一个长度是5的数组,并填充随机数,通过for循环,遍历数组,找出最小的一个值出来。
import java.util.Arrays;
/***
*求最小值
*/
public class Exercise {
public static void main(String[] args) {
int[] array = new int[5];
int min = 0;
array[0] = (int) (Math.random() * 100);
array[1] = (int) (Math.random() * 100);
array[2] = (int) (Math.random() * 100);
array[3] = (int) (Math.random() * 100);
array[4] = (int) (Math.random() * 100);
min = array[0];
for (int i = 0; i < array.length; i++) {
if(min > array[i]){
min = array[i];
}
System.out.print(array[i]+"\t");
}
System.out.println();
System.out.println("最小值为:"+min);
}
}
首先创建一个长度是5的数组,并填充随机数,使用for循环或者while循环,对这个数组实现反转效果
import java.util.Arrays;
/***
*反转数组
*/
public class Exercise {
public static void main(String[] args) {
int[] array = new int[5];
int temp;
array[0] = (int) (Math.random() * 100);
array[1] = (int) (Math.random() * 100);
array[2] = (int) (Math.random() * 100);
array[3] = (int) (Math.random() * 100);
array[4] = (int) (Math.random() * 100);
System.out.println("原数组:"+ Arrays.toString(array));
for (int i = 0; i < array.length/2; i++) {
temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
System.out.println("反转数组:"+ Arrays.toString(array));
}
}
首先创建一个长度是5的数组,并填充随机数,首先用选择法正排序,然后再对其使用冒泡法倒排序
如上!
首先创建一个长度是5的数组,并填充随机数,用增强型for循环找出最大的那个数
和最小值的一样,大于号变小于号
首先准备两个数组,他俩的长度是5-10之间的随机数,并使用随机数初始化这两个数组,然后准备第三个数组,第三个数组的长度是前两个的和,通过System.arraycopy 把前两个数组合并到第三个数组中
import java.util.Arrays;
/***
* 合并数组
*使用System.arraycopy复制两个数组到新的数组
*/
public class Exercise {
public static void main(String[] args) {
int[] array = new int[5];
int[] array1 = new int[10];
for (int i = 0; i < array.length; i++) {
array[i] = (int) (Math.random() * 100);
}
for (int i = 0; i < array1.length; i++) {
array1[i] = (int) (Math.random() * 100);
}
int[] array2 = new int[array.length+array1.length];
System.out.println("array >>>>"+Arrays.toString(array));
System.out.println("array1 >>>>"+Arrays.toString(array1));
System.arraycopy(array,0,array2,0,array.length);
System.arraycopy(array1,0,array2,array.length,array1.length);
System.out.print("array2 >>>>"+Arrays.toString(array2));
}
}
定义一个5X5的二维数组。 然后使用随机数填充该二维数组。找出这个二维数组里,最大的那个值,并打印出其二维坐标
import java.util.Arrays;
/***
* 二维数组最大值
*/
public class Exercise {
public static void main(String[] args) {
int[][] array = new int[5][5];
int[] max = new int[3]; //存储最大值和坐标
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
array[i][j] = (int) (Math.random() * 100);
System.out.print(array[i][j]+"\t");
}
System.out.println();
}
max[2] = array[0][0];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if(array[i][j] > max[2]){
max[0] = i;
max[1] = j;
max[2] = array[i][j];
}
}
}
System.out.println("最大值为:"+max[2]+"坐标为:"+max[0]+","+max[1]);
}
}
首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。
import java.util.Arrays;
/***
* 二维数组排序
*/
public class Exercise {
public static void main(String[] args) {
int[][] array = new int[10][5];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
array[i][j] = (int) (Math.random() * 100);
System.out.print(array[i][j]+"\t");
}
System.out.println();
}
//将生成的二维数组变成一维数组
int[] a = new int[array.length*array[0].length];
for (int i = 0; i < array.length; i++) {
System.arraycopy(array[i],0,a,array[i].length*i,array[i].length);
}
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//将排好序的一维数组写入二维数组中
int k = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
array[i][j] = a[k];
k++;
System.out.print(array[i][j]+"\t");
}
System.out.println();
}
}
}