9.26-数组
概念
同一类型数据的集合。其实数组就是一个容器。
好处
可以自动给的数组中的元素从0开编号(下标),
方便操作这些元素
定义数组的两种格式
格式一:(直接指定数组的长度(元素数量))
元素类型[] 数组名 = new 元素类型[数组的长度];
//通过new关键字创建一个int类型的数组对象,这个容器中有3个元素
int[] ary = new int[3];
注意
元素类型[] 数组类型 int[] double[] String[]
格式二(指定数组元素)
元素类型[] 数组名 = new 元素类型[]{元素1,元素2,...};
int[] ary = new int[]{3,5,1,7};
简写:
//静态初始化,只能用于声明数组变量的同时进行初始化
int[] ary = {3,5,1,7};
元素类型 [] 数组名 = new 元素类型[]{元素1,元素2,元素3...};
int [] arr =new int []{1,2,3,4};
//简写:静态初始化,只能用于声明变量的同时进行初始化
int [] arr ={1,4,4,56}
例子
package day9_26;
import java.util.Arrays;
public class ArryDemo02 {
/**
* 格式二演示
*/
public static void main(String[] args) {
int [] arr = {1,2,3};
//输出数组内容
System.out.println(Arrays.toString(arr));
//输出arr数组长度
System.out.println(arr.length);
//获取arr数组下标为0的元素
System.out.println(arr[0]);
//将arr数组的第一个元素改为8
arr[0]=8;
System.out.println(Arrays.toString(arr));
/*
*数组下标越界 异常
* int i = arr[arr.length];
* System.out.println(i);
*/
/*
arr =null;
空指针异常
用null调用任何的属性和方法都会引发空指针异常
System.out.println(arr.length);
*/
}
}
数组的填充与迭代(遍历)
例子一
package day9_26;
import java.util.Arrays;
public class ArrayDemo03 {
public static void main(String[] args) {
//数组的填充
int []ary =new int[10];
System.out.println(Arrays.toString(ary));
for(int i=0;i<ary.length;i++) {
/*
* Math 系统类(数学类)
*random() 生成一个随机的小数[0.0,1.0)
*/
ary [i]=(int) (Math.random()*10);
}
System.out.println(Arrays.toString(ary));
//数组的遍历(迭代)
String [] names = {"jack","rose","tom","jerry","andy"};
for(int i=0;i<names.length-1;i++) {
String name = names [i];
System.out.println(name);
}
}
}
例子二-回文数
package day9_26;
import java.util.Scanner;
public class ArrayDemo04 {
/**
* 需求:
* 在控制台输入一个五位的正整数
* 判断该整数是否为回文数
* 12321 回文数
* 34943 回文数
* @param args
*/
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入一个五位正整数:");
//五位数判断
int num;
while(true) {
num =sc.nextInt();
if(num<10000||num>99999) {
System.out.println("格式错误,请重新输入:");
}else {
break;
}
}
/*
* String valueOf(int n)
* 将给定的整数转换为字符串
*/
String str = String.valueOf(num);
/*
* String toCharArray()
* 将当前字符串转换为对应的字符数组char[]
* "12345"-》['1','2','3','4','5']
*/
char [] chs =str.toCharArray();
if(chs[0]==chs[4]&&chs[1]==chs[3]) {
System.out.println(num+"是回文数");
}else {
System.out.println(num+"不是回文数");
}
}
}
Arrays 数组工具类
Arrays.toString()
将给定数组中的元素链接为字符串,目的是便于输出
package day9_26;
import java.util.Arrays;
public class ArrarysDemo01 {
public static void main(String[] args) {
int [] ary= {1,23,5,4,31,22};
System.out.println(ary);//打印内存地址
System.out.println(Arrays.toString(ary));
String [] names= {"jack","rose","tom"};
System.out.println(names);
System.out.println(Arrays.toString(names));
char [] input = {'a','b','c'};
//字符数组较为特殊,可以直接作为字符串输出
System.out.println(input);
}
}
Arrays.equals()
比较两个数组的内容是否相等(包括内容、长度、大小、位置等)
package day9_26;
import java.util.Arrays;
public class ArraysDemo02 {
public static void main(String[] args) {
int [] ary1 = {2,3,4};
int [] ary2 = {2,3,4};
//"=="比较的是是否为同一对象
System.out.println(ary1==ary2);
//比较两个数组的内容是否相等
System.out.println(Arrays.equals(ary1,ary2));
}
}
Arrays.sort()
数组的排序方法(升序)
public class ArraysDemo03 {
public static void main(String[] args) {
int [] ary = {3,6,1,31,34};
System.out.println("排序前"+Arrays.toString(ary));
Arrays.sort(ary);
System.out.println("排序后"+Arrays.toString(ary));
String [] names= {"rose","jack","tom","andy"};
System.out.println("排序前"+Arrays.toString(names));
Arrays.sort(names);
//根据字符串首字母Unicode整数编码进行排序
System.out.println("排序后"+Arrays.toString(names));
}
}
Arrays.binarySearch()
二分查找法:根据给定的元素查找对应的下标
注意:不能在未排序的数组上进行查找
package day9_26;
import java.util.Arrays;
public class ArraysDemo04 {
public static void main(String[] args) {
String [] names= {"rose","jack","tom","andy"};
System.out.println("排序前"+Arrays.toString(names));
Arrays.sort(names);
//根据字符串首字母Unicode整数编码进行排序
System.out.println("排序后"+Arrays.toString(names));
//要查找的数组、要查找的元素
int index = Arrays.binarySearch(names, "jack");
System.out.println(index);
}
}
Arrays.copyOf()
数组的复制加扩充方法(复制为新数组)
package day9_26;
import java.util.Arrays;
public class ArraysDemo05 {
public static void main(String[] args) {
int [] ary1 = {2,3,4};
/*
* original 原数组
* newLength 复制后的新数组长度
*/
int [] ary2 = Arrays.copyOf(ary1,ary1.length);
System.out.println(Arrays.toString(ary2));
System.out.println(ary1==ary2);//false
String [] films = {
"隐入尘烟",
"明日战记",
"独行月球"
};
films = Arrays.copyOf(films, films.length+1);
System.out.println(Arrays.toString(films));
films[films.length-1]="笔仙大战贞子";
System.out.println(Arrays.toString(films));
}
}
Arrays.fill()
数组的填充
package day9_26;
import java.util.Arrays;
public class ArraysDemo06 {
public static void main(String[] args) {
int [] ary =new int [10];
//要填充的数组、要填充的值
Arrays.fill(ary, 8);
//只能将所有元素填充为此值,不能填充不同值
System.out.println(Arrays.toString(ary));
}
}
System.arraycopy()
数组的复制(可以在两个已经存在的数组之间进行复制)
package day9_26;
import java.util.Arrays;
public class SystemDemo {
public static void main(String[] args) {
int [] line1 = {0,0,0,0,5,6,7,8};
int [] line2 = {1,2,3,4,0,0,0,0};
int [] line3 = {0,0,3,4,0,0,7,8};
/*
* src 待复制的数组
* scrPos 待复制数组的起始位置(下标值)
* dest 复制到的数组
* destPos 复制到数组的起始位置(下标值)
* length 复制的长度
*/
System.arraycopy(line2, 0, line1, 0, 4);
System.out.println(Arrays.toString(line1));
System.arraycopy(line2, 0, line3, 0, 2);
System.out.println(Arrays.toString(line3));
System.arraycopy(line1, 4, line3,4, 2);
System.out.println(Arrays.toString(line3));
}
}
练习题
练习题一-双色球
* 需求:
* 双色球随机选号
* 规则:
* 1.六个红球 01~33 里面随机取出6个,不可重复,且按升序排序
* 2.一个蓝球 01~16里随机取出一个
* 3.将结果输出为一个数组
package day9_26;
import java.util.Arrays;
import java.util.Random;
public class DoubleColorBall_v1 {
/*
* 双色球随机选号规则
* 1.六个红球 01~33 里面随机取出6个,不可重复,且按升序排序
* 2.一个蓝球 01~16里随机取出一个
*
*/
public static void main(String[] args) {
//红球池
String [] redPool = {"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19","20",
"21","22","23","24","25","26","27","28","29","30","31","32"};
//取出号码暂存池
String [] poolEnd = new String[6];
//随机生成并赋值暂存池
Random rd = new Random();
for(int i=0;i<poolEnd.length;i++) {
int Rnum=rd.nextInt(redPool.length);
poolEnd[i]=redPool[Rnum];
//用红球池的末尾元素覆盖掉随机出的元素
redPool[Rnum]=redPool[redPool.length-1];
//利用缩容将红球池最后一个元素删除
redPool=Arrays.copyOf(redPool, redPool.length-1);
}
//创建篮球池
String [] bluePool = {"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16"};
String bluePoolEnd = bluePool[rd.nextInt(16)];
//扩容暂存池
poolEnd =Arrays.copyOf(poolEnd,poolEnd.length+1);
poolEnd[poolEnd.length-1]=bluePoolEnd;
//排序
Arrays.sort(poolEnd);
System.out.println(Arrays.toString(poolEnd));
}
}
练习题二-双色球增强写法
*基础规则与上题相同
*额外需求:
*将随机生成双色球的代码封装为方法,且判断方法的循环不允许使用与上题相同的方式
*方法返回字符串
*排除重复使用贴标签方式,新建等长boolean数组,亿boolean数组状态来判断是否重复
*控制台输入要购买的注数,打印对应数量的双色球号码
package day9_26;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class DoubleColorBall_v2 {
/**
*将随机生成双色球的代码封装为方法
*方法返回字符串
*排除重复,使用贴标签方式,新建等长boolean数组
*控制台输入要购买的注数,打印对应数量的双色球号码
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入购买注数");
int num = sc.nextInt();
for(int i =1;i<=num;i++) {
System.out.println(Arrays.toString(gen()));
}
}
public static String [] gen() {
//红球池
String [] redPool = {"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19","20",
"21","22","23","24","25","26","27","28","29","30","31","32"};
//取出号码暂存池
String [] poolEnd = new String[6];
//创建随机生成对象
Random rd = new Random();
//创建标签池
boolean [] redPoolTag = new boolean[redPool.length];
//填充标签默认值为false
//Arrays.fill(redPoolTag, false);
//循环
int i=0;
while(true) {
//生成随机下标
int Rnum=rd.nextInt(redPool.length);
//判断下标是否被使用
if(redPoolTag[Rnum]) {
continue;
}
//将随机值赋值到暂存池
poolEnd[i]=redPool[Rnum];
//将下标状态修改为已使用
redPoolTag[Rnum]=true;
//循环结束自增
i++;
//结束循环
if(i==poolEnd.length) {
break;
}
}
//创建蓝球池
String [] bluePool = {"01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16"};
String bluePoolEnd = bluePool[rd.nextInt(16)];
//扩容暂存池
poolEnd =Arrays.copyOf(poolEnd,poolEnd.length+1);
poolEnd[poolEnd.length-1]=bluePoolEnd;
//排序
Arrays.sort(poolEnd);
return poolEnd;
}
}
最后更新于