Day 6
今天学习数组
数组:
1.定义
所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
2.赋值方式
datatype[] arrayname; //推荐写法
datatype arrayname[]; //C语言风格,Java不推荐
- int[] test1 = new int[数组长度];
test1[0] = “数组0”;
test1[1] = “数组1”;
int[] nums=new int[10]; // 在数组中存储10个int数据,在内存中分配空间,默认数据是0
nums[0]=1;
nums[1]=2;
.........
- int[] test2 = {“数组0”,“数组1”,“数组2”,"…"};
int[] nums={1,2,3,4,5,6,7,8,9,10};
- int[] test3 = new int[]{“数组0”,“数组1”,“数组2”,"…"};
int[] nums=new int[]{1,2,3,4,5,6,7,8,9,10};
3. 特点
1.数组中的数据其数据类型一样
2.数组在初始化时,大小是确定的,且不可修改
3.数据是连续存储的,每一个数据分配的空间一样
4.查找数据效率高(来自于数组在内存中的存储特点)
索引:数组的索引从0开始,以(数组长度-1)结束
4.数组遍历:
//方式1:
for (int i = 0; i < nums.length; i++) {}
//方式2:
for(int num : nums12) { }
区别:语法上方式2简洁,方式2的foreach循环,只能获取元素的值而不能修改
使用上的选择:
仅仅是输出数组里的元素值,推荐使用foreach循环
如果需要改变元素的值或者循环时与索引有关,只能使用方式1
5.几道有特点的练习题
有一些地方没有优化略显复杂,大致思路是一样的,如果有更好的思路欢迎大家在评论中指出。
1.找出数组中重复出现的元素, 如{{ 3, 3, 44, 44, 3, 44, 33,55,88,3,44},找出3,44两个。
public class Array9 {
public static void main(String[] args) {
int[] num1s = { 3, 3, 44, 44, 3, 44, 33, 55, 88, 3, 44 };
int[] num2s = new int[num1s.length];
int count = 0;// 计数器判断有几个数重复
for (int i = 0; i < num1s.length; i++) {
for (int j = i + 1; j < num1s.length; j++) {
if (num1s[i] == num1s[j]) {
boolean a = true;// 判断标志
// 判断重复的值是否已经存在于数组之中
// 如果存在,就改变标志
for (int k = 0; k < num2s.length; k++) {
if (num2s[k] == num1s[i]) {
a = false;
break;
}
}
// 如果标志为true将重复的值存入数组
if (a) {
num2s[count++] = num1s[i];
}
}
}
}
for (int i = 0; i < count; i++) {
System.out.println(num2s[i]);
}
}
}
2.从键盘依次输入10个正整数, 要求每次存储到数组中时,保证其顺序为升序(从小到大)
一般思路是先将十个数输入数组再进行排序,如冒泡排序等。
下面程序思路是在输入同时按照数的大小进行插入。
public class Array10 {
public static void main(String[] args) {
int[] nums = new int[10];
Scanner sc = new Scanner(System.in);
int c = 1;//控制计算下标位置的循环次数
for (int i = 0; i < nums.length; i++) {
System.out.println("请输入第"+(i+1)+"个元素:");
int a = sc.nextInt();
int count = 0;//count为应该插入的位置
for (int j = 0; j < c; j++) {
if (a > nums[j]) {
count++;
}
}
count=count-1;//第一个应该在位置0
c++;
int b = 0;
//整体向后移直到count
for (int j = nums.length - 2; j >= count; j--) {
nums[j + 1] = nums[j];
}
//插入
nums[count] = a;
System.out.println(Arrays.toString(nums));//为了更直观将每一步的排序结果显示
}
System.out.println(Arrays.toString(nums));
}
}
即:
3.产生双色球的数列,规则如下:前6位是1-33之间不重复的随机数, 第7位是1-16之间的一个随机数。
public class Array11 {
public static void main(String[] args) {
int[] nums = new int[7];
c: for (int i = 0;i<nums.length; i++) {
int b = (int) (Math.random() * 33) + 1;
// 如果产生随机数等于之前存入数组的数跳过此次循环
for (int j = 0; j < nums.length - 1; j++) {
if (b == nums[j]) {
continue c;
}
}
nums[i] = b;
}
nums[6] = (int) (Math.random() * 16) + 1;
System.out.println(Arrays.toString(nums));
}
}
4.判断一个数组是否包含另一个数组,如{1,2,3,4,5} 包含 {2,3,4},不包含{3,5}
public class Array12 {
public static void main(String[] args) {
int[] num1s = { 1, 2, 3, 4, 5, 8, 9 };
int[] num2s = { 4, 5, 9 };
int[] num3s = new int[num2s.length];
// 循环比较数组二和数组三
for (int i = 0; i < num1s.length - num2s.length + 1;) {
// 将数组二长度的值从数组一中赋给数组三
for (int j = 0; j < num2s.length; j++, i++) {
num3s[j] = num1s[i];
}
i--;
// 比较数组二和数组三是否相等
if (Arrays.equals(num2s, num3s)) {
System.out.println("包含。");
break;
} else if (i == num1s.length - num2s.length) {
System.out.println("不包含。");
}
}
}
}