1.什么是数组
既然我们知道了数组的基本概念,那么数组用代码该如何表示呢?
首先 我们先声明一个数组:
int[ ] example;
然后比如这个数组中有5个元素:
example = new int[5];
然后我们为这个数组中的5个元素赋值,比如{80,60,40,20,10}
example[0] = 80;那么这个数组就变成了{80,0,0,0,0}
我们依次将剩下的元素赋值:
example[1]=60; example[2]=40; example[3]=20; example[4]=10;
那么我们就会得到:
int[ ] example = {80,60,40,20,10};
根据上面赋值的举例,我们就可以有两种声明数组的办法:
1. int[ ] example = new int[5];
2. int[ ] example = {80,60,40,20,10};
那么接下来我们将举例对数据进行处理:
2. Array类的一些常用方法
举例:
3.插入算法
如果我们想向一个数组中插入一个元素该怎么办呢?
假设我们现在有5个元素,如果向其中加入一个元素,那么首先我们需要重新声明一个包含6个元素的数组,也就是: int[ ] list = new int[6];
然后我们需要声明插入元素的位置:int index = list.length; 然后循环找到插入元素位置:
然后将该位置后的元素全部后移一格,最后插入数据:
4. 多维数组(二维数组)
举例:
二位数组的写法:
5. 总结
课堂练习:
1.输入5个整数,让其按升序排序
import java.util.Arrays;
import java.util.Scanner;
public class ke1 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int[] scores = new int[5];
for(int i=0;i<scores.length;i++){
System.out.print("输入:"+(i+1));
int score = input.nextInt();
scores[i] = score;
}
Arrays.sort(scores);
System.out.println(Arrays.toString(scores));
}
}
2.输入5个整数,找到其中最大值和最小值
import java.util.Scanner;
public class ke2 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int[] scores = new int[5];
for(int i=0;i<scores.length;i++){
System.out.print("输入"+(i+1)+":");
int score = input.nextInt();
scores[i] = score;
}
int max = scores[0];
int min = scores[0];
for (int i =1;i<scores.length;i++){
if (scores[i]>max){
max = scores[i];
}
if (scores[i]<min){
min = scores[i];
}
}
System.out.println(max+" "+min);
}
}
3.将下面的数组升序排序,然后降序排序
char[] num = {'a','c','u','b','e','p','f','z'};
import java.util.Arrays;
public class ke3 {
public static void main(String[] args) {
char[] num = {'a','c','u','b','e','p','f','z'};
char[] num1 = new char[8];
int j=0;
Arrays.sort(num);
System.out.println(Arrays.toString(num));
for (int i=num.length-1;i>=0;i--){
num1[j]=num[i];
j++;
}
System.out.println(Arrays.toString(num1));
}
}
4.输入5个学生的学号和分数,算出5个学生的平均分,找出最高分的学号和分数,然后算出及格的人数(大于等于60)
import java.util.Arrays;
import java.util.Scanner;
public class ke4 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int[] id = new int[5];
double[] scores = new double[5];
double sum = 0;
for (int i=0;i<id.length;i++){
System.out.print("输入学号:");
id[i] = input.nextInt();
System.out.print("输入成绩:");
scores[i] = input.nextDouble();
sum = sum+scores[i];
}
double avg = sum/5;
Arrays.sort(scores);
System.out.println("平均分:"+avg);
int maxId = id[0];
double maxScores = scores[0];
for (int i = 1; i < id.length; i++) {
if (scores[i] > maxScores) {
maxId = id[i];
maxScores = scores[i];
}
}
System.out.println("最高分学号和分数为:"+maxId+" "+maxScores);
int j=0;
for (int i = 1; i < id.length; i++) {
if (scores[i] >= 60) {
j++;
}
}
System.out.println("及格人数:"+j);
}
}
课后练习:
1.某商场正在进行促销活动,需要对 10 种热门商品的价格进行管理和分析。这 10 种商品的当前价格分别为:89、120、56、200、32、180、95、110、78、150(单位:元)。现在需要完成以下任务:
1. 将这些商品价格从小到大进行排序。
2. 计算这些商品的平均价格。
3. 找出价格最高和最低的商品价格。
4. 统计价格高于平均价格的商品数量。
import java.util.Arrays;
public class test1 {
public static void main(String[] args) {
double[] price = {89,120,56,200,32,180,95,110,78,150};
Arrays.sort(price);
System.out.println(Arrays.toString(price));
double total = 0;
for (int i=0;i<price.length;i++){
total = total +price[i];
}
double avg = total/10;
System.out.println("平均价格:"+avg);
double max=price[0];
double min=price[0];
for (int i=0;i<price.length;i++){
if (price[i]>max){
max = price[i];
}
if (price[i]<min){
min = price[i];
}
}
System.out.println("最高:"+max+" 最低:"+min);
int j=0;
for (int i=0;i<price.length;i++){
if (price[i]>avg){
j++;
}
}
System.out.println("高于:"+j);
}
}
2. 在一次考试中,一个班级有 15 名学生参加,他们的考试成绩分别为:78、92、65、88、56、95、80、72、85、68、90、76、82、58、98。现在需要根据这些成绩进行评级,评级规则如下:
90 - 100 分为 A 级
80 - 89 分为 B 级
70 - 79 分为 C 级
60 - 69 分为 D 级
0 - 59 分为 E 级
需要完成以下任务:
1. 统计每个等级的学生人数。
2. 找出获得 A 级的学生成绩。
import java.util.Arrays;
public class test2 {
public static void main(String[] args) {
int[] score ={78,92,65,88,56,95,80,72,85,68,90,76,82,56,98};
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int j = 0;
int[] scoreA = new int[4];
for (int i=0; i<score.length;i++){
if (score[i]>=90){
a++;
scoreA[j]=score[i];
j++;
}else if (score[i]>=80){
b++;
}else if (score[i]>=70){
c++;
}else if (score[i]>=60){
d++;
}else if (score[i]<60 && score[i]>=0){
e++;
}
}
System.out.println("A:"+a+" B:"+b+" C:"+c+" D:"+d+" E:"+e);
System.out.println("A成绩为:"+Arrays.toString(scoreA));
}
}
3. 一家超市记录了一周(7 天)的销售额,分别为:1200、1500、900、1800、2000、1600、1300(单位:元)。现在需要完成以下任务:
- 计算这一周销售额的最大值、最小值和平均值。
- 找出销售额连续增长的最长天数。
public class test3 {
public static void main(String[] args) {
double[] money = {1200,1500,900,1800,2000,1600,1300};
double max = money[0];
double min = money[0];
double total = 0;
int up = 0;
int maxUp = 0;
for (int i=0;i<money.length;i++) {
if (money[i] > max) {
max=money[i];
}
if (money[i] < min) {
min=money[i];
}
total=total + money[i];
while (i < 6) {
if (money[i + 1] > money[i]) {
up++;
if (up > maxUp) {
maxUp=up;
break;
}
} else if (money[i + 1] <= money[i]) {
up=0;
break;
}
}
}
double avg = total / money.length;
System.out.println("最大值: " + max);
System.out.println("最小值: " + min);
System.out.println("平均值: " + avg);
System.out.println("销售额连续增长的最长天数: " + maxUp);
}
}
4. 在日常生活中,我们常常关注天气温度的变化。现在假设我们记录了某一周(周一到周日)每天的最高气温,具体数据如下:22、25、28、26、24、21、23(单位:摄氏度)。我们需要通过 Java 程序对这些数据进行分析,具体完成以下几个任务:
1. 计算这一周的平均最高气温。
2. 找出这一周中的最高气温和对应的是周几。
3. 统计这一周中气温高于平均气温的天数。
public class test4 {
public static void main(String[] args) {
int[] temperature = {22,25,28,26,24,21,23};
double sum = 0;
int max = temperature[0];
int week = 0;
for(int i=0;i<temperature.length;i++){
sum = sum+temperature[i];
if (temperature[i]>max){
max = temperature[i];
week = i;
}
}
double avg = sum / temperature.length;
int maxDays=0;
for(int i=0;i<temperature.length;i++){
if (temperature[i]>avg){
maxDays++;
}
}
System.out.println("平均最高气温为:"+avg);
System.out.println("最高气温为:"+max+",在周"+(week+1));
System.out.println("高于平均气温的天数为:"+maxDays);
}
}
难度题:
1. 一家健身房记录了一周(周一到周日)内 6 名会员的健身时长(小时)和消费金额(元)。具体数据如下:(被挡住的地方是5)
消费金额数据(元)
健身房需要进行以下分析:
1.计算每个会员一周的总健身时长和总消费金额。
2.找出一周内总健身时长最长和总消费金额最高的会员编号。
3.计算每天所有会员的平均健身时长和平均消费金额。
4.分析健身时长和消费金额之间是否存在正相关关系(简单通过计算每个会员的平均健身时长和平均消费金额,若平均健身时长越长,平均消费金额越高,则认为有正相关关系)。
import java.util.Arrays;
public class test_plus {
public static void main(String[] args) {
int[][] vipHours={
{2, 3, 2, 4, 3, 5, 4},
{1, 2, 1, 3, 2, 4, 3},
{3, 4, 3, 5, 4, 6, 5},
{2, 3, 2, 4, 3, 5, 4},
{1, 2, 1, 3, 2, 4, 3},
{3, 4, 3, 5, 4, 6, 5},
};
double[][] vipMoney={
{50, 60, 50, 80, 60, 100, 80},
{30, 40, 30, 60, 40, 80, 60},
{70, 80, 70, 100, 80, 120, 100},
{50, 60, 50, 80, 60, 100, 80},
{30, 40, 30, 60, 40, 80, 60},
{70, 80, 70, 100, 80, 120, 100},
};
int vipNum=vipHours.length;
int vipDays=vipHours[0].length;
int vipHoursAmountMax=vipHours[0][0];
double vipMoneyTotalMax=vipMoney[0][0];
int hoursMaxvip=0;
int totalMaxvip=0;
double[] singleVipHours = new double[vipNum];
double[] singleVipMoney = new double[vipNum];
for (int i=0; i < vipNum; i++) {
int vipHoursAmount=0;
double vipMoneyTotal=0;
for (int j=0; j < vipDays; j++) {
vipHoursAmount=vipHoursAmount + vipHours[i][j];
vipMoneyTotal=vipMoneyTotal + vipMoney[i][j];
if (vipHoursAmount > vipHoursAmountMax) {
vipHoursAmountMax=vipHoursAmount;
hoursMaxvip=i + 1;
}
if (vipMoneyTotal > vipMoneyTotalMax) {
vipMoneyTotalMax=vipMoneyTotal;
totalMaxvip=i + 1;
}
}
System.out.println((i + 1) + "号会员一周总健身时常为:" + vipHoursAmount + "小时");
System.out.println((i + 1) + "号会员一周总消费金额为:" + vipMoneyTotal + "元");
System.out.println("------------------------------------------------------");
singleVipHours[i]=(double)vipHoursAmount / vipDays;
singleVipMoney[i]=vipMoneyTotal / vipDays;
}
System.out.println("一周内总健身时长最长的会员是:" + hoursMaxvip + ",时长为:" + vipHoursAmountMax + "小时");
System.out.println("一周内总消费最多的会员是:" + totalMaxvip + ",时长为:" + vipMoneyTotalMax + "元");
for (int i=0; i < vipDays; i++) {
int dailyHours=0;
double dailyMoney=0;
for (int j=0; j < vipNum; j++) {
dailyHours=dailyHours + vipHours[j][i];
dailyMoney=dailyMoney + vipMoney[j][i];
}
double avgHours=dailyHours / vipHours.length;
double avgMoney=dailyMoney / vipMoney.length;
System.out.println("周" + (i + 1) + "所有会员平均健身时长为:" + avgHours + "小时,平均消费金额:" + avgMoney + "元");
}
System.out.println(Arrays.toString(singleVipHours));
System.out.println(Arrays.toString(singleVipMoney));
//验证每个会员的每周的平均健身时长和平均健身金额
boolean flag = true;
for(int i=0;i<singleVipHours.length-1;i++){
if ((singleVipHours[i]>=singleVipHours[i+1] && singleVipMoney[i]>=singleVipMoney[i+1]) || (singleVipHours[i]<=singleVipHours[i+1] && singleVipMoney[i]<=singleVipMoney[i+1])){
//如果一个会员每周的平均时长和金额都大于等于或者小于等于其相邻的另一个会员,则正关系返回true
flag = true;
}else {
flag = false;
break;
}
}
if (flag == true){
System.out.println("健身时长和消费金额之间存在正相关关系");
}else {
System.out.println("健身时长和消费金额之间不存在正相关关系");
}
}
}
2. 有一个水果摊,售卖三种水果:苹果、香蕉和橙子。水果摊老板每天会准备一定数量的每种水果,苹果 50 个、香蕉 40 根、橙子 30 个。每种水果有不同的进价和售价,苹果进价 2 元,售价 4 元;香蕉进价 1 元,售价 3 元;橙子进价 3 元,售价 6 元。
顾客会陆续来到水果摊购买水果,每个顾客会随机选择一种水果,并且购买的数量也是随机的(苹果购买数量为 1 - 5 个,香蕉购买数量为 1 - 6 根,橙子购买数量为 1 - 4 个)。如果水果摊有足够的库存,就完成交易,老板获得相应的利润;如果库存不足,老板会告知顾客库存不够,顾客离开。
当所有水果都售罄时,一天的售卖结束,需要统计这一天水果摊的总利润、每种水果的销售数量
import java.util.Random;
public class test_plus {
public static void main(String[] args) {
Random random=new Random();
int[] name = {0,1,2};
//苹果0,香蕉1,橙子2
int[] count ={50,40,30};
int[] purchasePrice = {2,1,3};
int[] price = {4,3,6};
int[] buyNum = new int[3];
double total = 0;
do{
int nameChoice=random.nextInt(3);
//随机选择一种水果
int buyNumApple=random.nextInt(5);
int buyNumBanana=random.nextInt(6);
int buyNumOrange=random.nextInt(4);
nameChoice++;
buyNumApple++;
buyNumBanana++ ;
buyNumOrange++;
//苹果数量为1-5,香蕉数量为1-6,橙子数量为1-4
switch (nameChoice){
case 1:
if (buyNumApple<=count[0]){
count[0]=count[0]-buyNumApple;
total = total+((price[0]-purchasePrice[0])*buyNumApple);
//苹果(卖价-进价)*购买数量
buyNum[0]=buyNum[0]+buyNumApple;
System.out.println("顾客购买了"+buyNumApple+"个苹果,当前该水果剩余库存:"+count[0]);
}else if (buyNumApple>count[0]){
System.out.println("顾客想买"+buyNumApple+"个苹果,库存只有"+count[0]+",顾客离开。");
}
continue;
case 2:
if (buyNumBanana<=count[1]){
count[1]=count[1]-buyNumBanana;
total = total+((price[1]-purchasePrice[1])*buyNumBanana);
//香蕉(卖价-进价)*购买数量
buyNum[1]=buyNum[1]+buyNumBanana;
System.out.println("顾客购买了"+buyNumApple+"个香蕉,当前该水果剩余库存:"+count[1]);
}else if (buyNumBanana>count[1]){
System.out.println("顾客想买"+buyNumBanana+"个香蕉,库存只有"+count[1]+",顾客离开。");
}
continue;
case 3:
if (buyNumOrange<=count[2]){
count[2]=count[2]-buyNumOrange;
total = total+((price[2]-purchasePrice[2])*buyNumOrange);
//橙子(卖价-进价)*购买数量
buyNum[2]=buyNum[2]+buyNumOrange;
System.out.println("顾客购买了"+buyNumOrange+"个橙子,当前该水果剩余库存:"+count[2]);
}else if (buyNumOrange>count[2]){
System.out.println("顾客想买"+buyNumOrange+"个橙子,库存只有"+count[2]+",顾客离开。");
}
continue;
}
}while(!(count[0]==0 && count[1]==0 && count[2]==0));
System.out.println("总利润:"+total);
System.out.println("苹果 销售数量:"+buyNum[0]);
System.out.println("香蕉 销售数量:"+buyNum[1]);
System.out.println("橙子 销售数量:"+buyNum[2]);
}
}
3. 一个小型图书馆记录了一周(周一到周日)内 4 类书籍(小说、传记、科普、漫画)的借阅和归还数量。初始时,每类书籍的库存数量分别为:小说 200 本、传记 150 本、科普 120 本、漫画 180 本。具体的借阅和归还数据如下:
图书馆需要进行以下分析:
1.计算每天各类书籍的库存数量变化,并输出每天结束时各类书籍的库存数量。
2.找出一周内哪类书籍的借阅量最大,哪类书籍的归还量最大。
3.计算一周结束时各类书籍的最终库存数量,判断是否有书籍库存低于 100 本。
import java.util.Arrays;
public class ke_pluss1 {
public static void main(String[] args) {
String[] name = {"小说","传记","科普","漫画",};
int[] count = {200,150,120,180};
int[][] borrow ={
{20,15,12,18},
{22,17,13,20},
{18,14,10,16},
{25,19,15,22},
{23,16,14,21},
{30,22,18,25},
{28,20,16,23}
};
int[][] get ={
{10,8,6,10},
{12,9,7,11},
{8,7,5,9},
{15,10,8,12},
{13,9,7,11},
{20,12,10,14},
{18,11,9,13}
};
int[][] dailyRemain = new int[7][4];
for (int i=0;i<borrow.length;i++){
System.out.println("周"+(i+1)+"结束时的库存情况:");
for(int j=0;j<count.length;j++){
int dailyCount = count[j]-borrow[i][j]+get[i][j];
System.out.println(name[j]+" 库存"+dailyCount+"本");
count[j]=dailyCount;
dailyRemain[i][j]=dailyCount;
}
System.out.println("===========================================");
}
//每周库存数量变化
int sumMax =borrow[0][0];//借阅量最大
int sum1Max =get[0][0];//归还量最大
String nameMax = name[0];
String name1Max = name[0];
for (int i=0;i<count.length;i++){
int sum = 0;//借阅量每次循环重置
int sum1 = 0;//归还量每次循环重置
for(int j=0;j<borrow.length;j++){
sum = sum+borrow[j][i];
sum1= sum1+get[j][i];
}
if (sum>sumMax){
sumMax=sum;
nameMax = name[i];
}
if (sum1>sum1Max){
sum1Max=sum1;
name1Max = name[i];
}
}
System.out.println("借阅量最大的是:"+nameMax+",本数为:"+sumMax);
System.out.println("归还量最大的是:"+name1Max+",本数为:"+sum1Max);
//最大最小
System.out.println("===========================================");
String downName;
System.out.println(Arrays.toString(dailyRemain[6]));
for (int i = 0; i < count.length; i++) {
if (dailyRemain[6][i] < 100) {
downName = name[i];
System.out.println(downName+" 库存低于100本");
}
}
//检测周末低于100本
}
}
4. 酒店客房预订统计(多层循环)
在酒店运营管理中,准确统计客房预订情况对于合理安排资源、制定营销策略以及提升服务质量至关重要。一家颇具规模的酒店,为了更好地规划未来一段时间的运营,决定对未来 5 天的客房预订情况进行全面模拟统计。
酒店客房结构详细信息
这家酒店拥有 3 栋独立的住宿楼,分别标记为 A 栋、B 栋、C 栋。每栋楼由于建筑设计和定位不同,其楼层数量和每层的房间数量存在差异。
A 栋:这是酒店的主楼,楼层较高,一共有 10 层。每层设计了 20 个房间,这些房间涵盖了多种房型,以满足不同客人的需求,比如标准间、豪华套房等。
B 栋:规模相对较小,有 8 层。每层设置了 15 个房间,房间类型可能更偏向于经济实惠型,适合预算有限的旅客。
C 栋:是酒店新建成的楼,楼层最多,达到 12 层。每层有 25 个房间,房间设施较为新颖,可能包含一些特色房型,以吸引更多客人。
预订状态设定
为了便于统计和管理,酒店将每个房间每天的状态简化为两种:被预订和未被预订。用数字 1 表示该房间当天被预订,数字 0 表示未被预订。
统计目标
酒店需要通过模拟的方式,统计出每栋楼在未来 5 天内每天的预订房间总数,以及这 5 天的总预订房间数。这些数据将帮助酒店管理层了解客房的预订趋势,提前做好人员安排、物资准备等工作。例如,如果某栋楼某一天的预订房间数较多,酒店可以提前安排足够的保洁人员进行房间清洁,准备充足的生活用品等。
import java.util.Arrays;
public class ke_pluss {
public static void main(String[] args) {
String[] name={"A", "B", "C"};
int[] floor={10, 8, 12};
int[] floorRoom = {20, 15, 25};
int flat = name.length;
int[] rooms = new int[flat];
for (int i=0;i<flat;i++) {
rooms[i]=floor[i] * floorRoom[i];
}
System.out.println(Arrays.toString(rooms));//check
int book = 0;
int bookSum = 0;
for (int i=0;i<flat;i++){
System.out.println(name[i]+" 栋的预订情况:");
bookSum = 0;
for (int j=0;j<5;j++){
System.out.print("第"+(j+1)+"天预订的房间数:");
book = 0;
for (int k=0;k<rooms[i];k++){
int random = (int) (Math.random() * 2);//随机生成0或1
if (random == 1){
book++;
}
}
bookSum = bookSum + book;
System.out.println(book);
}
System.out.println(name[i]+"栋这5天总预订房间数:"+bookSum);
}
}
}