java学习---小项目---租房系统

package com.project.House_rental.HouseApp;

import com.project.House_rental.HouseView.HouseView;
//主界面
public class HouseApp {
    public static void main(String[] args) {
        new HouseView().List_();
        System.out.println("------已退出----------");
    }
}
package com.project.House_rental.House;

//定义·一个类,存放需要的属性
public class House {
    int id;//房屋编号
    String name;//房东姓名
    String tele;//电话
    String add;//地址
    double monthly_rent;//租金
    String stale;//状态
 //构造器
    public House(int id, String name, String tele, String add, double monthly_rent, String stale) {
        this.id = id;
        this.name = name;
        this.tele = tele;
        this.add = add;
        this.monthly_rent = monthly_rent;
        this.stale = stale;
    }
//封装
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTele() {
        return tele;
    }

    public void setTele(String tele) {
        this.tele = tele;
    }

    public String getAdd() {
        return add;
    }

    public void setAdd(String add) {
        this.add = add;
    }

    public double getMonthly_rent() {
        return monthly_rent;
    }

    public void setMonthly_rent(double monthly_rent) {
        this.monthly_rent = monthly_rent;
    }

    public String getStale() {
        return stale;
    }

    public void setStale(String stale) {
        this.stale = stale;
    }
    //重写toString方法

    @Override
    public String toString() {
        return
                "编号" + "\t\t 姓名" + "\t\t电话"+"\t\t地址" +"\t\t月租" +"\t\t状态\n"+ id+"\t\t"
                 + name + "\t\t" +
                 tele + "\t\t" +
                 add + "\t\t"+
                monthly_rent +"\t\t"+
                  stale + "\t" ;
    }
}
package com.project.House_rental.HouseServe;

import com.project.House_rental.House.House;
//实现效果所需的方法放入该类
public class HoseServe {
    House house[] = null;//定义一个House类的数组,暂时置空,用来接收房屋数据的
    private int size;//数组大小
    private int HosueNum = 1;//当前有的房屋信息数量,因为,在构造器我们初始化了一组房屋数据所以数量为1
    int idCount = 1;//房屋编号,有一组所以目前编号为1

    //构造器,用于初始化属性
    public HoseServe(int size) {

        this.size = size;
        house = new House[size];//初始化新建的数组,使其容量为size
        house[0] = new House(1, "小美", "12345", "北海", 1234, "未出租");//初始化一组数据

    }

    //类似一般属性封装的get
    public House[] List_() {
        return house;
    }
//数据的增加
    public Boolean HouseAdd_(House newhouse) {
        if (HosueNum == size) {//判断house数组当前数据是否已满
            System.out.println("数组已满无法添加");
            return false;
        } else {
            house[HosueNum++] = newhouse;//没满就将传进来的newhouse数据赋为house数组
            //下标从0开始,HouseNum计数从1开始,所以,HouseNum当前的值就正好为下个数值的下标,
            // 与此同时,HouseNum也需要自加,完成计数的任务
            System.out.println("添加成功!");
            newhouse.setId(++idCount);//id不能人为自己选择是多少,
            // 所以在此需要给新加入的数据自加编号
            return true;
        }


    }
//数据的删除
    public Boolean House_Delet(int idIndext) {
        //方法一

//        int i=0;
//        for( i=0;i<house.length;i++)
//        {
//           if (house[i].getId()==idIndext)//判断当前id是否是要删的id
//           {
//              break;//是的直接跳出循环不再接着循环
//           }
//        }
//        if (i<house.length) {//判断i的值,如果i的值还是小于数组长度,代表进入过循环中的if判断,
//        //且当前的i就是对应id的数据的下标
//            for (; i < house.length; i++) {
//                if (i + 1 < house.length)
//                    house[i] = house[i + 1];//将当前的数据用后面的数据覆盖,实现删除
//            }
//            HosueNum--;//因为删除了数据,所以相应的数据数量也要减少
//            return true;
//        }
//        else
//            return false;
//    }
        //方法二
        int indext_ = -1;//一个索引用来判断是否进入过判断
        for (int i = 0; i < HosueNum; i++) {
            if (house[i].getId() == idIndext) {//判断当前id是否是要删的id
                indext_ = i;
                break;
            }


        }
        //如果还为代表遍历完循环了并未进入过判断
        if (indext_ == -1) {
            return false;
        } else {
            for (int i = idIndext; i < HosueNum - 1; i++) {//下标从0开始,而HouseNum计数从1开始


                house[i] = house[i + 1];//将当前的数据用后面的数据覆盖,实现删除


            }
            house[--HosueNum] = null;//因为当前数据删了一个,删除数据后的所有数据都向前挪了一个,
            // 最后一个就会没有数值,所以需要将最后一个手动置空
            //并且计数的HouseNum也需要减少
            return true;
        }
    }
//查找
    public House House_Find(int Index1)
    {
        if (Index1>0&&Index1<=HosueNum) {//先判断是否存在

            for (int i=0;i<HosueNum;i++)
                if (Index1==house[i].getId())//寻找是否有对应编号的数据
                    return house[i];//找到了返回其数据


        }
        else
        {
            return null;//未找到,返回null
        }


        return null;
    }



}
package com.project.House_rental.HouseView;

import com.project.House_rental.House.House;
import com.project.House_rental.HouseApp.HouseApp;
import com.project.House_rental.HouseServe.HoseServe;
import com.project.House_rental.Utility.Utility;

import java.util.Scanner;

public class HouseView {
    private boolean o=true;//相当于索引,结束循环的工具
    private char key=' ';//执行操作的索引

    private HoseServe hoseServe=new HoseServe(10);//新建了个HoseServe类的属性这样可以实现调用该类的方法
    public void List_(){//用于展示的方法
    do{
        menu();//菜单目录
        key= Utility.readChar();//Utility包中的一个方法,功能:读取键盘输入的一个字符
        switch (key)//通过判断key中的为哪个字符从而去到相应的case实现效果
        {

            case '1':
                HouseAdd();
                break;
            case '2':
                HouseCheck();
                break;
            case '3':
                ViewDelet();
                break;
            case '4':
                House_modify();

                break;
            case '5':
                HouseList_();

                break;
            case '6':
              Quit();
                break;
            default:
                System.out.println("请重新输入");


        }



    }while(o);
    }
    //菜单
    private void menu(){
        System.out.println("--------房屋出租列表--------\n"+
                "1.新增房源\n"+"2.查找房源\n"+"3.删除房源\n"+"4.更改房源\n"+"5.查看房源\n"+"6.退出\n"+"1-6请输入一个数字"
        );
    }
    //查看房源列表
    private void HouseList_()
    {
        House house[]=hoseServe.List_();//调用了hoseServe中List_(),该方法返回了创建的House类型数组
        System.out.println("--------房屋列表-------");
        for(int i=0;i<house.length;i++)
        {
            //挨个遍历,但数组不一定都是满的,没有数据的数组会自动赋null,
            // 所以如果遍历到null值直接退出循环不执行之后的代码
            if (house[i]==null)
                break;
            System.out.println(house[i]);
        }

    }
    //添加
    private void HouseAdd()
    {
        System.out.println("姓名:");
        //手动输入要添加的数据的属性
        //* readString( );功能:读取键盘输入的指定长度的字符串
        // * @param limit 限制的长度
        // @return 指定长度的字符串
        String name=Utility.readString(9);
        System.out.println("电话:");
        String tele=Utility.readString(11);
        System.out.println("地址:");
        String add=Utility.readString(20);
        System.out.println("租金");
        Scanner scanner=new Scanner(System.in);
        double monthly_rent=scanner.nextDouble();
        System.out.println("状态(未出租/已出租):");
        String stale=Utility.readString(10);
        //新建一个House类型的对象将刚刚输入的信息传入其中
        House newhouse = new House(0, name, tele, add, monthly_rent, stale);
        //HouseAdd_(newhouse)方法的返回值为布尔类型,如果成功会返回true失败为false
        if (hoseServe.HouseAdd_(newhouse))
        {
            System.out.println("-------添加成功--------");
        }
        else
        {
            System.out.println("添加失败");
        }





    }
    //删除
    private void ViewDelet()
    {
        System.out.println("-------删除房屋--------\n");
        System.out.println("输入-1为退出");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */

        int index=Utility.readInt();

        if (index==-1)
            return;//输入-1表示退出
        else {
            /**Utility中的readConfirmSelection()方法
             * 功能:读取键盘输入的确认选项,Y或N
             * 将小的功能,封装到一个方法中.
             * @return Y或N
             */
            Utility.readConfirmSelection();
            System.out.println("请选择要删除的编号:\n");
            if (hoseServe.House_Delet(index)) {//House_Delet(index)方法的返回值为布尔类型,如果成功会返回true失败为false
                System.out.println("--------删除成功--------");
            } else {
                System.out.println("-------删除失败-------");
            }
        }


    }
    private void Quit(){
        /**Utility中的readConfirmSelection()方法
         * 功能:读取键盘输入的确认选项,Y或N
         * 将小的功能,封装到一个方法中.
         * @return Y或N
         */
       char c=Utility.readConfirmSelection();
       if (c=='Y')
       {
           o=false;//代表确定退出将o置为false即可退出循环

       }



    }
    //查找
    private void HouseCheck()
    {
        System.out.println("------查询房源--------");
        System.out.println("输入编号:");
        System.out.println("输入-1为退出");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */
        int Index1=Utility.readInt();
        //创建一个House类数据接收
        House house=hoseServe.House_Find(Index1);//House_Find(Index1)方法的返回类型为House,查到返回数据失败返回null
        if (house==null)
            System.out.println("查找失败!无此编号");
        else
            System.out.println(house);

    }
    //修改
    private void House_modify()
    {
        System.out.println("------修改房源--------");
        System.out.println("输入编号:");
        /** Utility中的readInt()方法
         * 功能:读取键盘输入的整型,长度小于2位
         * @return 整数
         */
        int Index1=Utility.readInt();
        House house=hoseServe.House_Find(Index1);//调用House_Find(Index1)方法查找该编号数据是否存在
        if (house==null)
            System.out.println("查找失败!无此编号");

        else {
            System.out.print("姓名(" + house.getName() + "):");
            //手动输入要修改的数据的属性
            //* readString( );功能:读取键盘输入的指定长度的字符串
            // * @param limit 限制的长度
            // @return 指定长度的字符串
            String name=Utility.readString(9);
            //判断name是否做修改,如果跟“ ”一样代表并未修改,那么就不用进入if更改house的name的值
            //如果修改了,则直接调用setName(name)方法,将修改的name的值传人其中
            if (!"".equals(name))
            {
                house.setName(name);
            }
            System.out.print("电话(" + house.getTele() + "):");
            String tele=Utility.readString(11);
            if (!"".equals(tele))
            {
                house.setTele(tele);
            }
            System.out.print("地址(" + house.getAdd() + "):");
            String add=Utility.readString(20);
            if (!"".equals(add))
            {
                house.setAdd(add);
            }
            System.out.print("月租(" + house.getMonthly_rent() + "):");
            Scanner scanner=new Scanner(System.in);
            double monthly_rent=scanner.nextDouble();
            if (!" ".equals(monthly_rent))
            {
                house.setMonthly_rent(monthly_rent);
            }
            System.out.print("状态(" + house.getStale() + "):");
            String state=Utility.readString(20);
            if (!"".equals(state))
            {
                house.setStale(state);
            }




        }


    }

}
package com.project.House_rental.Utility;
/**
 工具类的作用:
 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
 */

import java.util.*;
/**


 */
public class Utility {
    //静态属性。。。
    private static Scanner scanner = new Scanner(System.in);


    /**
     * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
     * @return 1——5
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);//包含一个字符的字符串
            c = str.charAt(0);//将字符串转换成字符char类型
            if (c != '1' && c != '2' &&
                    c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }

    /**
     * 功能:读取键盘输入的一个字符
     * @return 一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);//就是一个字符
        return str.charAt(0);
    }
    /**
     * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
     * @param defaultValue 指定的默认值
     * @return 默认值或输入的字符
     */

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /**
     * 功能:读取键盘输入的整型,长度小于2位
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, false);//一个整数,长度<=10位
            try {
                n = Integer.parseInt(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, true);
            if (str.equals("")) {
                return defaultValue;
            }

            //异常处理...
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
     * @param limit 限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }


    /**
     * 功能:读取键盘输入的确认选项,Y或N
     * 将小的功能,封装到一个方法中.
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.println("请输入你的选择(Y/N): 请小心选择");
        char c;
        for (; ; ) {//无限循环
            //在这里,将接受到字符,转成了大写字母
            //y => Y n=>N
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    /**
     * 功能: 读取一个字符串
     * @param limit 读取的长度
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     * 					  如果为false表示 不能读空字符串。
     *
     *	如果输入为空,或者输入大于limit的长度,就会提示重新输入。
     * @return
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {

        //定义了字符串
        String line = "";

        //scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行

            //如果line.length=0, 即用户没有输入任何内容,直接回车
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串,必须输入内容
            }

            //如果用户输入的内容大于了 limit,就提示重写输入
            //如果用户如的内容 >0 <= limit ,我就接受
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}


效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/843467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 插入数据 二.方法&#xff08;二&#xff09; &#x1f388;边走、边悟&#x1f388;迟早会好 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 建表语句如下&#xf…

react中组件间的通信

一、父传子 1.代码展示 import React, { useState } from react;function SonPage(props){ // 子组件const {msg} propsreturn (<div>我是子组件 {msg}</div>) }function App() { // 父组件const [msgText,setMsgText] useState(父传子)return (<div classN…

没有GPU就运行不了了吗?为什么生成的小游戏中什么都没有呀?

原来报错说是没有cuda&#xff0c;于是使用了GPU版本的tensorflow1.15&#xff0c;在主函数中加了下面的语句。 但但是还是 怎么办&#xff1f;

73、Flink 的 DataStream API 生产实践总结

0、汇总 1.可以使用 Maven 命令、CURL 命令、IDEA 手动创建 Flink 项目&#xff1b;2.可以使用 Maven Shade 插件将必需的依赖项打包进应用程序 jar 中&#xff1b;3.应该在 Flink 集群的 lib 文件夹内配置需要的&#xff08;核心&#xff09;依赖项&#xff1b;4.应该将程序中…

游戏常用运行库安装包 Game Runtime Libraries Package

游戏常用运行库安装包&#xff08;Game Runtime Libraries Package&#xff09;是一个整合了多种游戏所需运行库的安装程序&#xff0c;旨在帮助玩家和开发者解决游戏无法正常运行的问题。该安装包支持从Windows XP到Windows 11的系统&#xff0c;并且具备自动检测系统并推荐合…

持续集成07--Jenkins配置Allure测试报告

前言 在持续集成&#xff08;CI&#xff09;流程中&#xff0c;自动化测试报告是评估软件质量和追踪问题的重要工具。Allure Framework作为一个轻量级且功能丰富的测试报告工具&#xff0c;能够生成详细的测试报告&#xff0c;帮助团队更好地理解测试结果。本章节“持续集成07-…

springboot打jar包,部署linux,resource文件夹下的文件读取不到

目录 一、在windows10上可以正常执行 二、在linux上可行的方法 三、报错信息如下 就这一个小问题&#xff0c;困扰了我24H......可能还有更优解&#xff0c;欢迎讨论 一、在windows10上可以正常执行 以下3种方法均可以在windows10上正常使用&#xff0c;可以根据自己爱好&…

上海斯歌受邀出席CDIE2024数字化创新博览会,荣获优秀数字化技术服务商大奖!

6月25至26日&#xff0c;第十届CDIE数字化创新博览会在上海张江科学会堂盛大开幕&#xff0c;作为BPM领域头部品牌的上海斯歌应邀出席大会&#xff0c;与来自全国各地的行业专家们共同交流数字化创新的技术及业务经验。此外&#xff0c;为表彰上海斯歌对行业做出的卓越贡献&…

全面了解不同GPU算力型号的价格!

这两年人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、深度学习和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;GPU算力已成为不可或缺的资源。企业、研究机构乃至个人开发者越来越依赖于GPU加速计算来处理大规模数据集和复杂模…

3D 渲染一个房屋需要多长时间?

3D 渲染一个房屋总共需要 6-10 个工作日&#xff0c;主要取决于项目的复杂性和最终 3D 渲染的质量&#xff0c;图像越逼真&#xff0c;效果图渲染所需时间就越长。 1.3D建模 创建 3D 模型是第一步&#xff0c;所需时间可能因项目的复杂程度而有很大差异。一个简单的住宅渲染可…

我去,怎么http全变https了

项目场景&#xff1a; 在公司做的一个某地可视化项目。 部署采用的是前后端分离部署&#xff0c;图片等静态资源请求一台minio服务器。 项目平台用的是http 图片资源的服务器用的是https 问题描述 在以https请求图片资源时&#xff0c;图片请求成功报200。 【现象1】: 继图…

PWM再理解(1)

前言 昨天过于劳累&#xff0c;十点睡觉&#xff0c;本来想梳理一下PWM&#xff0c;今天补上。 PWM内涵 PWM全称&#xff1a;Pulse Width Modulation&#xff0c;也就是脉宽调制的意思&#xff0c;字面意思理解就是对脉冲的宽度进行改变。准确就是通过数字输出对模拟电路进行…

C# —— CRC16 算法

CRC16:即循环冗余校验码。数据通信当中一种常用的查错校验码 其特征信息字段和校验字段的长度可以是任意选定的&#xff0c;对数据进行指定多项式计算 并且将得到的结果附加在帧的后面&#xff0c;接受的设备也执行类似的算法&#xff0c;以保证数据传输的正确性和完整性 crc…

收银系统源码-商城下单,门店接单

随着新零售时代的不断进步&#xff0c;线下线上一体化的收银系统&#xff0c;被很多门店越来越重视。用户在线上商城下单后&#xff0c;门店如何接单呢&#xff0c;如何处理订单呢&#xff1f; 1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网…

Linux云计算 |【第一阶段】ENGINEER-DAY2

主要内容&#xff1a; 磁盘空间管理fdisk、parted工具、开机自动挂载、文件系统、交换空间 KVM虚拟化 实操前骤&#xff1a; 1&#xff09;添加一块硬盘&#xff08;磁盘&#xff09;&#xff0c;需要关机才能进行操作&#xff0c;点击左下角【添加硬件】 2&#xff09;选择2…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

WebRTC音视频-环境搭建

目录 期望效果 1:虚拟机和系统安装 2:WebRTC客户端环境搭建 2.1&#xff1a;VScode安装 2.2&#xff1a;MobaXterm安装 3:WebRTC服务器环境搭建 3.1&#xff1a;安装openssh服务器 3.2&#xff1a;安装Node.js 3.3&#xff1a;coturn穿透和转发服务器 3.3.1&a…

redis服务器同 redis 集群

搭建redis服务器 修改服务运行参数 常用命令常用命令 创建redis集群 准备做集群的主机&#xff0c;不允许存储数据、不允许设置连接密码 配置服务器&#xff1a; 1、在任意一台redis服务器上都可以执行创建集群的命令。 2、--cluster-replicas 1 给每个master服务器分配1台…

基于java的设计模式学习

PS &#xff1a;以作者的亲身来看&#xff0c;这东西对于初学者来说有用但不多&#xff0c;这些东西&#xff0c;更像一种经验的总结&#xff0c;在平时开发当中一般是用不到的&#xff0c;因此站在这个角度上用处不大。 1.工厂模式 1.1 简单工厂模式 我们把new 对象逻辑封装…