Java 第二周学习总结
一、数组
数组即一组用于存储相同数据类型的数据结构;数组是一种典型的线性结构(连续)。比如将一些商品数据呈现到页面中,此时可以将所有商品存储到数组中进行传递。数组是一种引用数据类型。数组中的每一个值都称之为元素
数组的声明和初始化
java中对输入的声明语法如下:
数据类型[] 数组名;
数据类型 数组名[];
//推荐
int[] i;
//不推荐
int j[];
double[] d;
boolean[] b;
char[] c;
String[] s;
数组初始化
动态初始化即,在声明数组时只指定数组的容量,不为数组中指定位置赋值
//声明一个长度(容量)为5的数组
int[] arr = new int[5];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
arr[4] = 60;
System.out.println(arr[4]);
操作数组
组中每一个元素都有一个独一无二的索引(下标),通过语法数组名[索引]可以获取数组中指定位置的元素;数组的索引从0开始;比如一个数组中有10个元素则索引从0~9;任何一个数组都包含一个length属性用于获取数组中元素的个数;
int[] arr = {
10,20,30,40};
//获取数组中第4个元素
int i = arr[3];
注意事项:
在对数组操作时如果下标(索引)使用不当 ,则会导致一个异常出现:
java.lang.ArrayIndexOutOfBoundsException
增强for循环-forEach
语法:
for(数据类型 变量名:数组名){
//循环体
}
以上循环中的数据类型表示的数组中每个元素对应的数据类型
int[] arr = {
1,4,5,7,9,11,13,19};
//增强for循环(forEach:迭代器-Iterator)
for(int n:arr) {
System.out.println(n);
}
String[] names = {
"德玛西亚","瑞兹","易大师","墨菲特"};
for(String name:names) {
System.out.println(name);
}
多维数组(二维数组)
**多维数组即数组中的数组。**在实际的应用中多维数组的使用也很常见(比如二维数组),电影院座位布局,教室座位布局,游戏开发中游戏元素的坐标。
声明语法
数据类型[][] 数组名
数据类型 数组名[][]
int[][] i;
//不推荐
int i[][];
二维数组即数组中的数组,一个数组中的每一个元素还是一个数组
int[][] i = {
{
1,3,5},
{
2,4,6},
{
8,9}
};
// System.out.println(i[1][1]);
// System.out.println(i[2][1]);
//二维数组的遍历
//行
for(int m = 0; m < i.length;m++) {
//列
for(int n = 0;n < i[m].length; n++) {
int e = i[m][n];
System.out.print(e+" ");
}
System.out.println();
}
System.out.println("=================");
//1. 使用forEach对以上二维数组遍历
for(int[] m:i) {
for(int n:m) {
System.out.print(n+" ");
}
System.out.println();
}
数组复习
- 数组时一种只能够存储相同数据类型的数组结构
- 数组中每一个元素都有一个索引
- 数组中的索引从0开始
- 任何数组都存在length属性
- 数组的长度一旦定义则无法改变
- 数组动态初始化必须要指定长度(对于二维数必须要指定行数)
数组常见练习
去零问题
- 有一个数组{19,0,7,5,0,2,0,11,22,32,0},将数组中非0的数存储到一个新数组中
int[] i = {
19,0,7,5,0,2,0,11,22,32,0};
//1.统计不为0的数总数
int count = 0;
for(int n:i) {
if(n != 0) {
count++;
}
}
//2.根据不为0的数个数创建对应容量的新数组
int[] j = new int[count];
//3.将原数组中不为0的数存储到新数组
for(int m = 0,n = 0;m < i.length; m++) {
if(i[m] != 0) {
j[n++] = i[m];
}
}
//输出新数组的元素
for(int n:j) {
System.out.println(n);
}
排序
冒泡排序
每两个相邻的数比较
/**
* 冒泡排序
* @author mrchai
*
*/
public class Exp02 {
public static void main(String[] args) {
int[] a = {
9,5,4,8,7,6,3,18,2,1,11,12};
for(int i = 0;i < a.length;i++) {
//初始临时变量
int t = 0;
for(int j = 0;j < a.length - 1;j++) {
//判断左边的数是否大于右边的数
if(a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
//输出第n趟排序
System.out.print("第"+(i+1)+"趟:");
for(int n:a) {
System.out.print(n+" ");
}
System.out.println();
}
}
}
选择排序
从第一个数开始依次跟之后的每一个数比较
public class Exp03 {
public static void main(String[] args) {
int[] a = {
9,5,4,8,7,6,3,18,2,1,11,12};
for(int i = 0;i < a.length; i++) {
//声明临时变量
int t = 0;
for(int j = i + 1;j < a.length; j++) {
if(a[i] > a[j]) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//输出第n趟排序
System.out.print("第"+(i+1)+"趟:");
for(int n:a) {
System.out.print(n+" ");
}
System.out.println();
}
}
}
折半查找(二分法)
折半查找也叫二分法,或者二分查找;从一组已经排好序的数组中搜索目标数的为止,思路:
- 先从数组中找到中间数
public class Exp05 {
public static void main(String[] args) {
//原数组
int[] a = {
1,2,3,4,5,6,7,8,9,11,12,18,22,30,45};
//目标数
int target = 22;
//初始开始搜索位置
int start = 0;
//初始终止搜索位置
int end = a.length-1;
//初始目标数位置
int index = -1;
//统计搜索次数
int count = 0;
//当起始的搜索位置小于等于结束的搜索位置时执行比较
while(start <= end) {
//搜索次数递增
count++;
//获取中间数位置
int mid = (start + end) / 2;
//判断中间数和目标数的大小
if(target > a[mid]) {
//如果目标数大于了中间数,则搜索的起始位置设置到中间数位置+1
start = mid + 1;
}else if(target < a[mid]) {
//如果目标数小于中间数,则搜索的结束位置设置到中间数位置-1
end = mid - 1;
}else {
//找到目标数
index = mid;
break;
}
}
System.out.println("搜索次数"+count+"目标数位置:"+index);
}
}
约瑟夫环
/**
* 约瑟夫环
* 有500个人围城一个圈,依次报数,每数到3的倍数的人离开圈,数完一圈后继续从1开始数,
* 直到圈中剩下最后一个人,求剩下的人原来在圈中的位置(约瑟夫环问题)
* @author mrchai
*
*/
public class Exp07 {
public static void main(String[] args) {
//初始一个长度未500的布尔数组,表示所有人是否在圈中
boolean[] b = new boolean[500];
//初始所有人都在圈中
for(int i = 0;i < b.length;i++) {
b[i] = true;
}
//当前遍历到的索引
int index = 0;
//计数器(统计目前数到几)
int count = 0;
//初始总人数
int len = b.length;
//只要总人数超过1个就循环报数
while(len > 1) {
//判断当前报数的人是否在圈中
if(b[index]) {
//计数器递增
count++;
//判断是否到达3
if(count == 3) {
//如果到达3则当前位置的人从圈中离开
b[index] = false;
//人数减少一个
len--;
//计数器归零
count = 0;
}
}
index++;
//判断是否已经数完一圈
if(index == b.length) {
index = 0;
}
}
//对数组遍历
for(int i = 0;i<b.length;i++) {
//获取每一个位的结果
if(b[i]) {
//如果其中有一个元素为true,则表示剩下的最后一个人
System.out.println(</