Java数组 :数组、Arrays类、排序
一.数组
数组是一个变量,存储相同数据类型的一组数据
数组的结构和基本要素
标识符:数组的名称,用于引用不同的数组
数组元素:向数组中存放的数据
元素下标:对数组元素进行编号,数组下标从0开始
元素类型:数组元素的数据类型
【注】声明一个数组就是在内存空间划出一串连续的空间
- 1. 一维数组
数组的声明及赋值
/**第一种直接赋值**/
int[] score = {89, 79, 76};
/**第二种new 方式创建**/
int[] score = new int[]{89, 79, 76};
int[] score =new int[4];
/**第三种动态赋值**/
Scanner input = new Scanner(System.in);
for(int i=0;i<score.length;i++){
score[i]=input.nextInt();
}
【实例 1】:求5人的平均成绩
Scanner sc=new Scanner(System.in);
int[] arr=new int[5];
int sum=0;
int avg=0;
System.out.println("请输入5个人的成绩:");
for(int i=0;i<arr.length;i++){
System.out.println("第"+(i+1)+"个人的成绩为:");
arr[i]=sc.nextInt();
sum+=arr[i];
}
avg=sum/arr.length;
System.out.println("这个5个人的平均成绩为:"+avg);
【实例 2】:求5人的平均成绩
Scanner sc=new Scanner(System.in);
int[] arr=new int[5];
int sum=0;
int avg=0;
System.out.println("请输入5个人的成绩:");
for(int i=0;i<arr.length;i++){
System.out.println("第"+(i+1)+"个人的成绩为:");
arr[i]=sc.nextInt();
sum+=arr[i];
}
avg=sum/arr.length;
System.out.println("这个5个人的平均成绩为:"+avg);
- 2. 二维数组
数组的声明
int [ ][ ] scores; //定义二维数组
scores=new int[5][50]; //分配内存空间
或者
int [ ][ ] scores = new int[5][50];
数组的赋值
/**第一种**/
int[][] scores= {{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
/**第二种**/
int[][] scores=new int[][]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }};
【实例 1】:求3个班级每个班级的总成绩
int [][] array = new int[][]{{80,66},{70,54,98},{77,59}}; //三个班的成绩
int total; //保存总成绩
for(int i = 0; i < array.length; i++) {
String str = (i+1) + "班";
total = 0; //每次循环到此都将其归0
for(int j = 0; j < array[i].length; j++) {
total += array[i][j]; //成绩叠加
}
System.out.println(str+"总成绩:" + total);
}
二.Arrays类
【注】Arrays类提供了操作数组的一些static方法,其常用方法如下:
方法名称 |
说 明 |
boolean equals(array1,array2) |
比较array1和array2两个数组是否相等 |
sort(array) |
对数组array的元素进行升序排列 |
String toString(array) |
该方法将一个数组array转换成一个字符串 |
void fill(array,val) |
把数组array所有元素都赋值为val |
copyOf(array,length) |
把数组array复制成一个长度为length的新数组,返回类型与复制的数组一致 |
int binarySearch(array, val) |
查询元素值val在数组array中下标(要求数组中元素已经按升序排列) |
1、复制数组System.arraycopy(),用它复制数组比用for循环复制要快得多。
2、基本类型数组和对象数组都可以复制,然而,如果复制对象数组,那么只是复制了对象的引用——而不是对象本身的拷贝。这被称作“浅复制”。
3、数组的比较:
【注】对于Arrays.equals ,S1的所有元素指向同一个对象,而数组s2包含五个相互独立的对象,然而,数组相等是基于内容的(通过Object.equal()比较),所以结果为true。
Arrays .equal()
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] s1 = new String[5];
Arrays.fill(s1,"Hi");
String[] s2 = {"Hi", "Hi", "Hi", "Hi", "Hi"};
System.out.println(Arrays.equals(s1, s2));//true
System.out.println(s1.equals(s2));//false
System.out.println(s1==s2);//false
}
}
4、数组元素的比较:
1).Java有两种方式来提供比较功能。第一种是实现java.lang.Comparable接口,此接口中只有compareTo(Object o)一个方法。
2).实现Comparator接口,重写两个方法compare(Object o1, Object o2)和equals(Object o)两个方法。
5、基本数据数组无法使用Comparator进行排序。
6、在使用binarySearch()时必须提供同样地Comparator(使用方法的重载版本)。
7、数组是效率最高的保持一组对象的方式,它是你的第一选择。而且,如果要保存基本类型,则只能用数组。
三. 排序
- 1. 冒泡排序
【实例 1】:冒泡算法
int[] arr = { 14, 9, 8, 15, 34, 5 };
int temp=0;
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i;j++) {
if (arr[j] >arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i : arr) {
System.out.println(i);
}
- 2. 选择排序
【实例 1】:选择排序算法
int[] arr = { 14, 9, 8, 90, 34, 5,78 };
int minIndex;
int temp;
for (int i = 0; i < arr.length-1; i++) {
minIndex=i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex =j;
}
}
if(minIndex!=i){
temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
}
for (int i : arr) {
System.out.println(i);
}