1.数组
1.1.数组的基本知识:
- 1.空间存储上,内存地址是连续的。
- 2.每个元素占用的空间大小相同。
- 3.首元素的内存地址即“数组的地址”。
- 4.通过下标可以计算出偏移量。
- 5.通过一个数学表达式,就可以快速计算出某个下标位置上元素的内存地址,直接通过内存地址定位,效率非常高。
1.2.数组的优、缺点
- 优点:检索效率高。(条件:1、4、5)
- 缺点:随机增删效率较低(注意,是随机!数组最后一个元素的增删效率不受影响。)
- 数组无法存储大数据量。(因为很难在内存中找到一块很大的、地址连续的内存空间)
1.3.一维数组的静态初始化和动态初始化
静态初始化:
-
int[] arr = {1,2,3,4}; Object[] objs = {new Object(), new Object(), new Object()};
动态初始化:
-
int[] arr = new int[4]; // 4个长度,每个元素默认值0 Object[] objs = new Object[4]; // 4个长度,每个元素默认值null
1.4.二维数组:
静态初始化:
int[][] arr = { {1,2,34},
{54,4,34,3},
{2,34,4,5}
};
Object[][] arr = { {new Object(),new Object()},
{new Object(),new Object()},
{new Object(),new Object(),new Object()}
};
1.5.数组的copy—— System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
数组有一个特点长度一旦确定,不可变。
所以长度不够时,需要扩容,方法:新建一个大数组。
将小数组copy到大数组。
数组copy案例程序:
int[] a={1,2,3,4,5}——>int[] b=new int[10];
执行结果:
/**********数组copy******/
class ArrayCopy{
public static void main(String[] args) {
int[] a={1,2,3,4,5};
//输出数组a
System.out.print("小数组a:");
for (int i=0;i< a.length;i++) {
System.out.print(a[i]+",");
}
System.out.println();//换行
int[] b=new int[10];
System.arraycopy(a,0,b,0,a.length);
//输出数组b
System.out.print("大数组b:");
for (int i=0;i< b.length;i++) {
System.out.print(b[i]+",");
}
}
}
1.6.main方法——public static void main(String[] args) {}
main方法上“String[] args”参数的使用(非重点,了解一下,以后一般都是有界面的,用户可以在界面上输入用户名和密码等参数信息。)
用户输入的不同字符串之间用空格分开。
eg.用户传入用户名和密码:
-
java class文件名 zhangsan 12345678
2.冒泡排序算法
……………………
3.选择排序算法
选择排序比冒泡排序的效率高。
效率高在交换位置的次数上。
选择排序的交换位置是有意义的。
循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和
最前面的数据“交换位置”。每循环一次,参与比较的数就少一个。
4.Java项目——一维数组模拟栈数据结构——酒店管理系统
4.1.一维数组模拟栈数据结构
要求:
-
1.这个栈可以存储java中任何引用类型的数据
-
2.在栈中提供push方法模拟压栈,(栈满了,要有提示信息)
-
3.在栈中提供pop方法弹栈(栈空了要有提示信息)
-
4.编写测试程序,new栈对象,调用push、pop来模拟压栈、弹栈
程序:
public class AnalogData2 {
public static int srcPos0=-1;
public static void main(String[] args) {
/***万能口袋Object**/
StackOperation2 stack=new StackOperation2();
stack.Mystack();/***初始化一维数组*/
//stack.elements是数组,
//stack.index是指针
while(true){
//输入操作目的:
System.out.println();
System.out.println("请输入操作目的……压栈_y?弹栈_t?");
java.util.Scanner s =new java.util.Scanner(System.in);
String instruction=s.next();//接收字符串
/****压栈*/
if("y".equals(instruction)) {
System.out.println("请输入压栈数据……");
java.util.Scanner s2 =new java.util.Scanner(System.in);
String objData=s2.next();//接收字符串
stack.pushStack(stack,objData);
}
/****弹栈**/
else if ("t".equals(instruction)) {
stack.popStack(stack);
}
else
System.out.println("输入错误,请重新输入……");
}
}
}
class StackOperation2{
Object[] elements;
int index;
public void Mystack(){ /***创建对象*/
this.elements=new Object[10];
this.index=-1;
}
/****构造方法**/
public StackOperation2() {
}
/***压栈*/
public void pushStack(StackOperation2 stacksrc,Object objData){
//srcPos==stacksrc.index;
if (stacksrc.index+1>=0 && stacksrc.index+1<stacksrc.elements.length){
//stacksrc.index++;/***压栈前,指针上移指向”未来的“栈顶*/
stacksrc.elements[++stacksrc.index]=objData;
System.out.println("压栈成功");
System.out.println("栈顶指针位置(0~9):"+(stacksrc.index));/***输出栈顶指针位置,因为已经压入一个,所以+1*/
System.out.print("输出栈内元素:");
for (int i=0;i<= stacksrc.index;i++)
System.out.print(stacksrc.elements[i]+",");
}
else
System.out.println("栈满,压栈失败");
}
/***弹栈*/
public void popStack(StackOperation2 stacksrc){
if (stacksrc.index>=0 && stacksrc.index< stacksrc.elements.length){
stacksrc.elements[stacksrc.index--]=null;/**弹栈*/
//stacksrc.index--;
System.out.println("弹栈成功");
System.out.println("栈顶指针位置(0~9):"+stacksrc.index);/***输出栈顶指针位置,因为已经弹出一个,所以-1*/
System.out.print("输出栈内元素:");
for (int i=0;i<= stacksrc.index;i++)
System.out.print(stacksrc.elements[i]+",");
}
else if (stacksrc.index<0){
System.out.println("弹栈失败");
}
}
}
4.2.酒店管理系统
- 为某个酒店编写程序,酒店管理系统,模拟订房、退房、打印所有房间状态,的功能
-
1.系统用户是:酒店前台
-
2.酒店用一个二维数组来模拟。Room[][] rooms
-
3.酒店中每一个房间都应该是一个java对象:Room
-
4.每个房间都应该有:房间号、房间类型、房间是否空闲
-
5.系统应该对外提供的功能:
-
可以预订房间:输入房间号订房
-
可以退房:输入房间号退房
-
可以查看所有房间状态
程序说明:
- 输入d,订房;输入c,查某一房间;输入t,退房;输入s,输出所有房间状态;
- 系统初始化,第一层:单人间,第二层:标准间,第三层:豪华间
- 默认,3层,每层20个房间。
- 输入数字必须是3位:eg.109,表示1层9号房。
public class HotelManage {
public static void main(String[] args) {
if (args.length!=2) {
System.out.println("输入不正确,请重新登陆……");
return ;
}
if ("homeinns".equals(args[0]) && "abc".equals(args[1])){
System.out.println("登陆成功,请继续操作……");
}
else{
System.out.println("登陆失败");
return ;
}
//系统初始化,第一层:单人间,第二层:标准间,第三层:豪华间
Room [][] rooms=new Room[3][20];//这里只是创建了Room类的数组,还没有赋值
for (int i=0;i< rooms.length;i++) {
for (int j = 0; j < rooms[i].length; j++) {
rooms[i][j] = new Room(); //给二维数组rooms赋Room类的值
rooms[i][j].setNo((i+1)*100+(j+1));//赋“房间号”
switch (i) {
case 0: {
rooms[i][j].setType("单人间");/**一楼是单人间*/
break;
}
case 1: {
rooms[i][j].setType("标准间");
break;
}
case 2: {
rooms[i][j].setType("豪华间");
break;
}
}
}
}
while(true){
//输入操作目的:
System.out.println("请输入操作目的……订房_d?退房_t?查房_c?输出房间状态_s?");
java.util.Scanner s =new java.util.Scanner(System.in);
String i=s.next();//接收字符串
/****查房操作**/
// if("查房".equals(i)){
if("c".equals(i)){
System.out.println("请输入查询3位房间号……(101~320)");
java.util.Scanner floors1 =new java.util.Scanner(System.in);
int floor1=floors1.nextInt();
if((floor1>=101 && floor1<=120)||(floor1>=201 && floor1<=220)||(floor1>=301 && floor1<=320)) {
System.out.println(floor1 + "房间" + "是" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getState() + "的" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getType());
}
else
System.out.println("房间号输入错误");
}
/***订房操作*/
// else if("订房".equals(i)){
else if("d".equals(i)){
System.out.println("请输入预定3位房间号……(101~320)");
java.util.Scanner floors1 =new java.util.Scanner(System.in);
int floor1=floors1.nextInt();
if((floor1>=101 && floor1<=120)||(floor1>=201 && floor1<=220)||(floor1>=301 && floor1<=320)) {
if ("空房".equals(rooms[floor1 / 100 - 1][floor1 % 100 - 1].getState())) {
rooms[floor1 / 100 - 1][floor1 % 100 - 1].setState("非空");
System.out.println(floor1 + "号" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getType() + "预订成功");
} else
System.out.println(floor1 + "号" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getType() + "已有预订,本次预订失败");
}
else
System.out.println("房间号输入错误");
}
/****退房操作*/
// else if("退房".equals(i)){
else if("t".equals(i)){
System.out.println("请输入退订3位房间号……(101~320)");
java.util.Scanner floors1 =new java.util.Scanner(System.in);
int floor1=floors1.nextInt();
if((floor1>=101 && floor1<=120)||(floor1>=201 && floor1<=220)||(floor1>=301 && floor1<=320)) {
if ("非空".equals(rooms[floor1 / 100 - 1][floor1 % 100 - 1].getState())) {
rooms[floor1 / 100 - 1][floor1 % 100 - 1].setState("空房");
System.out.println(floor1 + "号" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getType() + "退订成功");
} else
System.out.println(floor1 + "号" + rooms[floor1 / 100 - 1][floor1 % 100 - 1].getType() + "是空房,本次退订失败");
}
else
System.out.println("房间号输入错误");
}
/***输出所有房间状态**/
else if("s".equals(i)){
Room.printRoom(rooms);
}
else {
System.out.println("输入错误,请重新输入……");
}
}
}
}
//定义抽象类
class Room{
private int no;//房间编号[楼层][房间]
private String type;//房间类型:标准间、单人间、豪华间
private String state="空房";//房间状态:空房、非空
//默认为空房
/***设定房间号、读取房间号*/
public void setNo(int no){
this.no=no;
}
public int getNo(){
return this.no;
}
/***设定房间类型、读取房间类型*/
public void setType(String type){
this.type=type;
}
public String getType(){
return this.type;
}
/***设定房间状态、读取房间状态*/
public String getState(){
return this.state;
}
public void setState(String state){
this.state=state;
}
//打印房间号、状态
public static void printRoom(Room[][] rooms){
for (int i=0;i< rooms.length;i++) {
for (int j = 0; j < rooms[i].length; j++) {
System.out.print("["+rooms[i][j].no+ "号" + rooms[i][j].type +rooms[i][j].getState()+"],");
}
System.out.println();
}
}
}