JavaDay15——数组——冒泡排序——选择排序

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();
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值