5.1数组的概论
数组是具有相同数据类型的一组数据的集合。
5.2一维数组
一维数组实际上是一组相同类型数据的线性集合,当在程序中需要处理一组数据,或者传递一组数据时,可以应用这种类型的数组。本节将讲解一维数组的创建、初始化及应用。
5.2.3例题:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int day[]=new int[] {31,28,31,30,31,30,31,31,30,31,30,31};
//创建一个int类型的一维数组day;
for(int i=0;i<12;i++) {//循环
System.out.println((i+1)+"月有"+day[i]+"天");输出结果
}
}
}
5.3.二维数组
创建二维数组
二维数组可以看作是特殊的一维数组,因此二维数组的创建同样有两种方法。
初始化二维数组
二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。
使用二维数组
二维数组在实际应用用的非常广泛。
例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[][] = new int[3][4]; //定义一个int型的二维数组a指定3行4列
for (int i = 0; i < a.length; i ++) { //循环找到每个一维数组的地址
for (int j = 0; j < a[i].length; j ++) { //循环输出每个一维数组中的值
System.out.print(a[i][j]);
}
System.out.println();
}
}
}
5.4数组的基本操作
遍历数组:遍历数组就是获取数组中的每个元素,通常遍历数组都是用for循环来实现
例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int b[][] = new int[][]{{1,3,2},{2,1,3},{4,5,6}};//定义二维数组
for(int k = 0;k < b.length;k++) {
for(int c = 0; c < b.length; c++){//遍历循环数组中的每个元素
System.out.print(b[k][c]); //将数组中的元素输出
}
System.out.println();//换行
}
}
}
5.4例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr2[][] = {{4,3},{1,2}}; //定义二维数组
System.out.print("数组中的元素是"); //提示信息
int i = 0; //外层循环计数器变量
for(int x[] : arr2) { //外层循环变量为一维数组
i++; //外层计数器递增
int j = 0; //内层循环计数器变量
for(int e : x) { //循环遍历每一个数组元素
j ++; //内层计数器递增
if(i == arr2.length && j == x.length) { //判断变量是二维数组中的最后一个元素
System.out.print(e); //输出二维数组的最后一个元素
}else //如果不是二维数组中的最后一个元素
System.out.print(e + "·-");//输出信息
}
}
}
}
填充替换数组元素:数组中的元素定义完后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的元素的替换。fill()方法有两种参数类型。
例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[5]; //定义一个数组
Arrays.fill(arr, 8); //使用同一个值队数组进行填充
for (int i = 0; i < arr.length; i ++) { //循环遍历数组中的元素
System.out.println("第"+ i +"个元素是:"+ arr[i]); //将数组中的元素逐个输出
}
}
}
5.6例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[] {45,12,2,10};//定义一个二维数组
Arrays.fill(arr, 1,2,8); //使用fill()方法替换数组中指定范围的元素
for(int i=0; i < arr.length; i++) {//遍历循环数组中的元素
System.out.println("第"+ i +"个元素是:"+ arr[i]);//输出数组中的元素
}
}
}
对数组进行排序:通过Arrays类的静态方法sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。(口诀:前改后不改)
例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[] {23,42,12,8};//定义一个二维数组
Arrays.sort(arr); //使用sort()方法对数组进行排序
for(int i=0; i < arr.length; i++) {//遍历循环数组中的元素
System.out.println(arr[i]);//循环输出数组中的元素
}
}
}
复制数组:Array中的copyOf()方法与copyOfRange()方法可以实现对数组的复制(口诀:空位补0,溢出去掉)
例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[] {23,42,12};//定义一个二维数组
int newarr[] = Arrays.copyOf(arr, 5);//使用copyOf对数组进行复制
for(int i=0; i < newarr.length; i++) {//循环遍历数组中的元素
System.out.println(newarr[i]);//循环输出数组中的元素
}
}
}
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[] {23,42,12,43,21,11};//定义一个二维数组
int newarr[] = Arrays.copyOfRange(arr,0,3);
//使用Array。copyOfRange对指定的数组范围进行复制
for(int i=0; i < newarr.length; i++) {//循环遍历数组元素
System.out.println(newarr[i]);//循环输出数组元素
}
}
查询数组:
Array中的binarySearch()方法,可以用二分搜索法来搜索指定数组,以获得指定对象,它有两种方法(先排序再查询,前含后不含)
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[] {1,8,9,4,5};//定义一个一维数组
Arrays.sort(arr); //将数组排序
int index = Arrays.binarySearch(arr, 4);
//使用binarySearch查询数组中指定的元素
System.out.print("4的索引位置是:"+ index);//将查询到的元素输出
}
}
5.11例:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
import java.util.Arrays;
public class liti5_11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str[] = new String[] {"ab","cd","ef","yz"};//定义一个一维数组并赋值
Arrays.sort(str); //进行排序
int index = Arrays.binarySearch(str,0,2,"cd");//使用binarySearch搜索指定值
System.out.print("cd的索引位置是:"+ index);//将搜索到的值输出
}
}
数组排序算法:
冒泡排序:是最常用的数组排序算法之一,它排序数组元素的过程总是将小的数往前放,较大的往后放,类似水中冒泡往上升的动作,所以叫冒泡排序
基本思想:比较相邻的元素,把较小的元素移动到数组前面,把较大的元素放到数组后面,这样较小的元素就像气泡一样从底部上升到顶部
算法示例:冒泡排序由双层循环实现,外层循环用于控制层数,一般要循环数组长度减一次才能保证完成排序,内层循环主要用于对比数组中每个相邻的元素大小判断是否交换位置
例:
直接选择排序
例:
反转排序:
以相反的顺序把原有数组的元素重新排序,也是经常用到的一种排序方法
基本思想:
将数组最后一个元素和第一个元素交换,倒数第二个元素和第二个元素交换,以此类推,直到把所有元素反转替换
算法示例:
反转排序是对数组两边的元素进行替换,所以只需要循环数组长度的半数次,如果数组长度位奇数,例如数组长度为7,那么只会循环3次,中间的数不变
例题:
package keshang;
import java.util.Arrays;
public class ks {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {10,20,30,40,50,60}; //创建一个数组
ks sorter = new ks();//创建反转排序的对象
sorter.sort(array); //调用排序对象方法,将数组排序
}
public void sort(int[] array) {
System.out.println("数组原有内容:");
showArray(array); //输出排序前的数组元素
int temp;
int len = array.length;
for(int i = 0;i < len / 2;i++) {
temp = array[i];
array[i] = array[len - 1 - i];
array[len - 1 - i] = temp;
}
System.out.println("数组反转后内容");
showArray(array); //输出排序后的数组元素
}
public void showArray(int[] array) {
for(int i: array) { //遍历数组
System.out.print("\t"+ i); //输出每个数组元素值
}
System.out.println();
}
}