/**
数组Array的学习
*/
public class ArrayDemo01{
public static void main(String[] args){
/*数组的声明和初始化:
--初始化有三种写法
--静态初始化(1种)
--动态初始化(2种)
*/
/*存储整型3,4,6,1,2
*/
int[] nums = {3,4,5,1,2};
int[] num_s = new int[]{3,4,6,1,2};
/*输出数组nums的元素个数*/
System.out.println("nums:"+nums.length);
System.out.println("num_s:"+num_s.length);
/*访问nums的第一个元素
访问num_s的最后一个元素
并输出
*/
int num = nums[0];
System.out.println("num:"+num);
System.out.println("num_s[4]:"+num_s[4]);
}
}
数组的赋值
/**
数组间的赋值:即变量的赋值
*/
public class ArrayDemo04{
public static void main(String[] args){
int[] arr1 = {1,3,5,7,100};
int[] arr2 = arr1;
for (int i = 0;i<arr2.length ;i++ ){
System.out.print(arr2[i]+"\t");
}
System.out.println();
/*将arr2的第一个元素改为1000*/
arr2[0] = 1000;
for (int i = 0;i<arr2.length ;i++ ){
System.out.print(arr2[i]+"\t");
}
/*遍历一下arr1的元素*/
System.out.println();
for (int i = 0;i<arr1.length ;i++ ){
System.out.print(arr1[i]+"\t");
}
/*
数组间的变量赋值,
通过一个变量对数组的元素进行修改,
那么与之相关的变量对应的数组的元素
也会发生变化。
如:
int[] a = {1,2,3};
int[] b =a;
通过b修改元素,a对应的数组也跟着改变
*/
/*基本数据类型变量间的赋值*/
int a = 5;
int b = a;
b = 10;
System.out.println(b);
System.out.println(a);
}
}
Arrays的调用和使用
/**
数组的工具类:Arrays
使用步骤:
1:导包
2:调用其功能
*/
import java.util.Arrays;
public class ArrayDemo05{
public static void main(String[] args){
int[] scores = {1,2,10,100};
String info = Arrays.toString(scores);
System.out.println(info);
//也可以直接写
int[] sc = {1,2,10,100};
System.out.println(Arrays.toString(sc));
//创建5个长度的布尔数组fs
boolean[] fs = new boolean[5];
System.out.println(Arrays.toString(fs));
//查看fs数组的第六个元素
System.out.println(fs[5]);/*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at ArrayDemo05.main(ArrayDemo05.java:25)
数组下标越界异常,编译器检查不出来此异常,运行时才会出现。出现的结果
造成了程序的结束。
*/
System.out.println("over");
}
}
数组工具类复制
/**
工具类的数组复制功能
*/
import java.util.Arrays;
public class ArrayDemo07{
public static void main(String[] atgs){
int[] nums = {1,2,3,4,5};
int[] num1 = Arrays.copyOf(nums,5);
System.out.println(Arrays.toString(num1));
/*创建要给int类型的num2,长度为10,前五个元素为num1的内容。*/
int[] num2 = Arrays.copyOf(num1,10);
System.out.println(Arrays.toString(num2));
/*创建一个数组num3,长度为4,存储num1的前四个元素*/
int[] num3 = Arrays.copyOf(num1,4);
System.out.println(Arrays.toString(num3));
}
}
数组的定义遍历存值
public class TestDemo01{
public static void main(String[] args){
/*定义一个字符数组chs,存储a~z*/
/*定义一个字符串数组names,
存储10个学生的姓名
*/
/*
定义一个int数组scores,用于存储这10个学生的成绩,
成绩使用随机数[90,100],计算出平均成绩
找到成绩的最大值,并输出其姓名
找到成绩的最小值,并输出其姓名
*/
char[] chs = new char[26];
for (int i=0;i<chs.length ;i++ ){
chs[i]=(char)(i+97);
System.out.print(chs[i]+" ");
}
System.out.println();
String[] names = new String[10];
for (int i = 0;i<names.length ;i++ ){
names[i]="小"+(char)(i+65);
System.out.print(names[i]);
}
System.out.println();
int sum = 0;
int[] scores = new int[names.length];
for (int i = 0;i<scores.length ;i++ ){
int s =(int)(Math.random()*11+90);
scores[i] = s;
sum+=s;
System.out.print(scores[i]+" ");
}
double avg_score = sum/scores.length;
System.out.println("平均分为:"+avg_score);
int max = scores[0];
int min = scores[0];
for (int i = 0;i<scores.length ;i++ ){
if (scores[i]>max){
max = scores[i];
}
if (scores[i]<min){
min = scores[i];
}
}
System.out.println("最高成绩为:"+max);
System.out.println("最低成绩为:"+min);
/*
需要直到最高最低成绩的下标,才能知道人名
而最高/最低成绩的下标可能有多个,需要保存
到一个新数组
统计最高成绩/最低成绩的人数
*/
int h_count = 0;
int l_count = 0;
for (int i = 0;i<scores.length ;i++ ){
if (scores[i]==max){
h_count++; //统计最高成绩的个数
}
if (scores[i]==min){
l_count++; //统计最低成绩的个数
}
}
//将最高/最低成绩的下标存入新数组中
int [] max_indexs = new int[h_count];//用来存储最高成绩的下标
int max_count = 0;//用于下标的自增
int [] min_indexs = new int[l_count];
int min_count = 0;//用于下标的自增
for (int i = 0;i<scores.length ;i++ ){
if (scores[i]==max){
max_indexs[max_count++]=i;//找到最高成绩的下标并存入新数组
}
if (scores[i]==min){
min_indexs[min_count++]=i;
}
}
/*
输出 最高成绩的姓名和分数
从存储下标的数组中,取出值,此值是names数组的下标
*/
for (int i = 0;i<max_indexs.length ;i++ ){
int v = max_indexs[i];
System.out.println("最高成绩者:"+names[v]+":"+scores[v]);
}
/*输出 最低成绩的姓名和分数*/
for (int i = 0;i<min_indexs.length ;i++ ){
int v = min_indexs[i];
System.out.println("最低成绩者:"+names[v]+":"+scores[v]);
}
}
}
练习1:/*
创建一个长度为n [50,100]的字符数组.
随机存储n个小写的英文字母,
然后统计每个字母出现的次数。
*/
三种方法
import java.util.Arrays;
public class TestDemo03{
public static void main(String[] args){
int n = (int)(Math.random()*51+50);
char[] num = new char[n];
for (int i = 0;i<num.length ;i++ ){
num[i] = (char)(Math.random()*26+97);
}
System.out.println(Arrays.toString(num));
for (int i = 0;i<num.length ;i++ ){
int sum = 0;
boolean label = true;
for (int j = 0;j<num.length ;j++ ){
if (num[i]==num[j]){
sum++;
}
}
for (int k = 0;k<i ;k++ ){
if (num[i]==num[k]){
label = false;
}
}
if (label){
System.out.println(num[i]+":"+sum);
}
}
//方法二
int n1 = (int)(Math.random()*51+50);
char[] num1 = new char[n1];
for (int i = 0;i<num1.length ;i++ ){
num1[i] = (char)(Math.random()*26+97);
}
System.out.println(Arrays.toString(num1));
int[] num2 = new int[0];
for (int i = 0;i<num1.length ;i++ ){
boolean f = true;
for (int j = 0;j<num2.length ;j++ ){
if (num2[j]==num1[i]){
f = false;
break;
}
}
if (f){
num2 = Arrays.copyOf(num2,num2.length+1);
num2[num2.length-1]=(int)num1[i];
}
}
for (int i = 0;i<num2.length ;i++ ){
int sum = 0;
for (int j = 0;j<num1.length ;j++ ){
if (num2[i]==(int)num1[j]){
sum++;
}
}
System.out.println((char)num2[i]+":"+sum);
}
//第三种
int n2 = (int)(Math.random()*51+50);
char[] num3 = new char[n2];
for (int i = 0;i<num3.length ;i++ ){
num3[i] = (char)(Math.random()*26+97);
}
System.out.println(Arrays.toString(num3));
for (int i = 0;i<num3.length ;i++ ){
int count = 1;
boolean label = true;
for (int j = 0;j<i ;j++ ){
if (num3[i]==num3[j]){
label = false;
break;
}
}
if (!label){
continue;
}
for (int j=i+1;j<num3.length ;j++ ){
if (num3[i]==num3[j]){
count++;
}
}
System.out.println(num3[i]+":"+count);
}
}
}
冒泡排序
/**
冒泡排序
{6,3,1,2,5,4}
第一轮:找到最大的元素 6
6>3 true {3,6,1,2,5,4}
6>1 true {3,1,6,2,5,4}
6>2 true {3,1,2,6,5,4}
6>5 true {3,1,2,5,6,4}
6>4 true {3,1,2,5,4,6}
第二轮:找到第二大的元素 5
3>1 true {1,3,2,5,4,6}
3>2 true {1,2,3,5,4,6}
3>5 false {1,2,3,5,4,6}
5>4 true {1,2,3,4,5,6}
第三轮:找到第三大的元素 4
1>2 false {1,2,3,4,5,6}
2>3 false {1,2,3,4,5,6}
3>4 false {1,2,3,4,5,6}
第四轮:找到第四大的元素 3
1>2 false {1,2,3,4,5,6}
2>3 false {1,2,3,4,5,6}
第五轮:找到第五大的元素 2
1>2 false {1,2,3,4,5,6}
--->外层控制轮数:
范围:
i=0;
i<length-1
内层控制每轮比较的次数:
范围:
j=0;
j<length-1-i
*/
import java.util.Arrays;
public class ArrayDemo01{
public static void main(String[] args){
int[] arr1 = {6,3,1,2,5,4};
/*要求数组里的元素按照从小到大排序*/
int a = 0;
for (int i = 0;i<arr1.length-1 ;i++ ){
System.out.println("第"+(i+1)+"轮");
boolean f = true; //每一轮都定义一个开关
for (int j = 0;j<arr1.length-1-i ;j++) {
if (arr1[j]>arr1[j+1]){
int t = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1]= t;
f = false;//发生交换,修改开关状态
}
System.out.println(Arrays.toString(arr1));
}
//此轮结束,查看开关的状态
if (f){
//开关状态没变,说明已经完成了排序
//所以不用继续下一轮
break;
}
}
System.out.println("从小到大排序:"+Arrays.toString(arr1));
}
}
简单排序
import java.util.Arrays;
public class TestDemo01{
public static void main(String[] args){
int[] arr = {4,5,2,3,1};
/*
冒泡排序的每一步详情;
第一轮:找最大值
4>5 false {4,5,2,3,1}
5>2 true {4,2,5,3,1}
5>3 true {4,2,3,5,1}
5>1 true {4,2,3,1,5}
*/
/*
简单选择排序;基本思路如下
原始数据{4,5,2,3,1}
找出最小1 与4交换 {1,5,2,3,4}
找出最小2 与5交换 {1,2,5,3,4}
找出最小3 与5交换 {1,2,3,5,4}
找出最小4 与5交换 {1,2,3,4,5}
*/
for (int i = 0;i<arr.length-1 ;i++ ){
System.out.println("第"+(i+1)+"轮");
for (int j = 0;j<arr.length-1-i ;j++ ){
if (arr[j]>arr[j+1]){
int t = arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
System.out.println(Arrays.toString(arr));
}
}
System.out.println(Arrays.toString(arr));
System.out.println("--------------------------------------------");
//简单排序
int[] arr2 = {4,5,2,3,1};
for (int i = 0;i<arr2.length-1 ;i++ ){
int min = arr2[i]; //假设arr2[i]是最小的
int index = -1; //记录每次最小值的下标
boolean f = false; //定义一个标记
for (int j = i+1;j<arr2.length ;j++){
if (min>arr2[j]){
min = arr2[j]; //将较小值赋给min
index = j; //同时记录下标
f = true; //改变标记
}
}
//内层结束
if (f){ //查看标记,标记更改,说明需要交换
int t = arr2[i];
arr2[i]=arr2[index];
arr2[index]=t;
}
}
System.out.println(Arrays.toString(arr2));
//
int[] arr1 = {56,72,356,111,1};
for (int i = 0;i<arr1.length ;i++ ){
for (int j = i+1;j<arr1.length ;j++ ){
if (arr1[i]>arr1[j]){
int t = arr1[j];
arr1[j]= arr1[i];
arr1[i]= t;
}
}
}
System.out.println(Arrays.toString(arr1));
}
}
工具类排序
import java.util.Arrays;
public class ArrayDemo02{
public static void main(String[] args){
int[] arr1 = {5,3,2,4,1};
System.out.println(Arrays.toString(arr1));
//调用工具类的排序方法
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
String[] names =
{"A","abc","bac","01","03","02"};
//调用工具类的排序方面
Arrays.sort(names);
System.out.println(Arrays.toString(names));
}
}
二维数组
/**
二维数组的学习:
概念:数组的元素依然时一个数组。
*/
import java.util.Arrays;
public class ArrayDemo01{
public static void main(String[] args){
/*二维数组的声明和初始化*/
/*静态初始化:*/
int[][] a = {{1,2},{3,4,5},{6,7}};
/*使用for循环进行遍历*/
for (int i = 0;i<a.length ;i++ ){
int[] n = a[i];
//System.out.println(Arrays.toString(n));
for (int j = 0;j<n.length ;j++ ){
System.out.print(n[j]+" ");
}
System.out.println();
}
/*动态初始化
二维数组等长式初始化,需要考虑数组下标越界异常
*/
int[][] b = new int[6][5];
/*访问输出第一个数组*/
System.out.println(Arrays.toString(b[0]));
b[0][0] = 1;
//b[0][6] = 7;越界
System.out.println(Arrays.toString(b[0]));
/*第二种动态初始化
只规定了高维的长度。
里面的元素是null,
不能直接进行赋值。
应该先把null替换成相应的数组对象
{{1,2},{1,2,3},null}
*/
int[][] c = new int[3][];
//输出c的第一个元素
System.out.println(c[0]);//输出:null---引用数据的默认值
c[0] = new int[2];//将null替换成数组对象
c[0][0] = 1;
c[0][1] = 2;
System.out.println(Arrays.toString(c[0]));
c[1] = new int[3];
c[1][1] = 4;
System.out.println(Arrays.toString(c[1]));
c[2] = new int[2];
System.out.println(Arrays.toString(c[2]));
}
}
import java.util.Scanner;
import java.util.Arrays;
public class TestDemo02{
public static void main(String[] args){
/*录入10个学生的数学,语文,英语三科成绩
计算数学/语文/英语的平均成绩,
并找出每科成绩的最高分与最低分。
*/
Scanner sc = new Scanner(System.in);
double[][] score = new double[5][3];
for (int i = 0;i<score.length ;i++ ){
System.out.println("录入第"+(i+1)+"个学生的数学/语文/英语成绩:");
for (int j = 0;j<score[i].length ;j++ ){
double input = sc.nextDouble();
score[i][j] = input;
}
}
//查看每个学生的成绩
for (int i = 0;i<score.length ;i++ ){
System.out.println(Arrays.toString(score[i]));
}
//计算每科平均成绩
String[] s = {"数学平均分:","语文平均分:","英语平均分:"};
for (int i = 0;i<3;i++ ){
double sum = 0;
for (int j = 0;j<5 ;j++ ){
sum+= score[j][i];
}
System.out.println(s[i]+sum/5);
}
//计算每个人的平均分
for (int i = 0;i<5;i++ ){
double sum = 0;
for (int j = 0;j<3 ;j++ ){
sum+= score[i][j];
}
System.out.println("第"+(i+1)+"个同学的平均成绩"+(int)((sum/3)*100)/100.0+" ");//平均分保留两位小数
}
//找出每科中的最高和最低分
double[] min = new double[3];
double[] max = new double[3];
String[] s1 = {"数学最低分:","语文最低分:","英语最低分:"};
String[] s2 = {"数学最高分:","语文最高分:","英语最高分:"};
for (int i = 0;i<3 ;i++ ){
min[i]=101;
max[i]=1;
for (int j = 0;j<score.length;j++ ){
if (min[i]>score[j][i]){
min[i]=score[j][i];
}
if (max[i]<score[j][i]){
max[i]=score[j][i];
}
}
System.out.println(s1[i]+min[i]);
System.out.println(s2[i]+max[i]);
}
}
}