zoukankan      html  css  js  c++  java
  • 图书馆仿真

         这是我一次仿真的尝试,但是老实说,自我感觉并不是很好,因为有关于线程的问题并没有想清楚,而且,真的,线程这种东西真的是很让人头晕啊,虽然我看书的时候,对于那些基础的知识点是能够理解,但是自己写代码的时候,就发现一个问题,就是现实生活中的实际模型复杂得很,不是书上几个例子就能涵盖的,看来我还是得慢慢捉摸这块,毕竟并发这块在现代越来越重要,尤其是现在交互式已经烂大街了。好吧,我先说明一下,这次我的仿真对象是什么,只是一个模拟中间有一个中转台的图书馆查询系统,就像是前台你跟服务员说一下你想要找的书,然后,然后服务员传达给中转台,中转台在它的库里寻找相关的内容,然后生成一份名单,名单上有这些书的评分,接着再到图书馆里寻找,毕竟图书馆里面的书的信息已经更换过了或者被别人借走了,假设中转台的信息是比较落后的。 首先,说一下我的代码的执行流程,首先,我一个方法是用来让用户输入关键字的,然后将这个关键字传给中转台,使它能够根据这个关键字在它的信息库里找出相应的图书,接着就是将这份名单传给图书馆,图书馆再进一步看看它的信息库里有没有包含该书,然后就是显示出来。这个过程,我们可以看到一点,就是如果用户没有输入关键字,那个整个流程根本就不会开始,接着就是中转台如果没有生成名单,那么,图书馆也就不会运行,也就不会有任何东西显示出来。那么,这个过程可以向下面那样进行:

           用户输入关键字--->中转台开始搜索图书信息,这时,如果没有名单交给图书馆,那么,图书馆这边应该告诉用户,现在正在检索中,等到图书馆开始工作时,如果没有生成名单,那么,正在检索的信息依然还在控制台上显示,知道图书馆这边生成名单,就会告诉用户,检索完毕,然后将名单显示出来,中间的确没有什么共享的资源,因为它们之间的关系并不是竞争,更像是一种传递,只有前面一个流程结束,后面才能开始,那么,线程要如何体现呢?我觉得,所谓的线程,也就是一直在运转的线程就是那个所谓的正在检索中吧,因为它所贯穿的是两个过程,也就是说,这个线程的开始是在输入关键字开始,图书馆开始生成名单后结束,那么,我就能这么写,当关键字输入完后,这个线程就被唤醒,然后这个线程直到图书馆生成名单后挂起。那,我不应该将之前三个过程分开,因为它们其实是在一块的逻辑,在这块的逻辑中,决定什么时候将检索这个线程唤醒和挂起而已。,好吧,试试看,然后,再得到这个运行的时间,来看看检索的时间到底有多长。

           然后上代码:

         

    public class Library {
        private static long startTime = 0;
        private static long endTime = 0;
    
        @SuppressWarnings("deprecation")
        public static void main(String[] args) throws InterruptedException {
            Thread t = new Thread(new Call());
            String name = enterName();
            List<RatingBook> ratingList = checkName(name, t);
            List<RatingBook> bookList = getBook(ratingList);
            int flag = 0;
            for (int i = 0; i < bookList.size(); i++) {
                if ((bookList.get(i).getBook()).equals("")) {
                    flag++;
                }
            }
            if (flag == bookList.size()) {
                t.stop();
                endTime = System.currentTimeMillis();
                System.out.println("图书馆没有书!" + "检索所需时间为:" + "\n"
                        + (endTime - startTime));
            } else {
                sortBook(bookList);
                t.stop();
                endTime = System.currentTimeMillis();
                for (int i = 1; i < bookList.size(); i++) {
                    if (!(bookList.get(i).getBook().equals(""))) {
                        RatingBook book = bookList.get(i);
                        showInfor("图书馆里的图书列表:", book);
                    }
                }
                System.out.println("检索所需时间为:" + "\n" + (endTime - startTime));
            }
    
        }
    //显示书本的内容
        private static void showInfor(String string, RatingBook book) {
    
            System.out.println(string + book.getBook() + " 评分:" + book.getRating());
        }
    //按照评分的高低来将名单进行排列
        private static void sortBook(List<RatingBook> list) {
    
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    if ((list.get(i).getRating()) < (list.get(j).getRating())) {
                        String temp = list.get(i).getBook();
                        int rating = list.get(i).getRating();
                        list.get(i).setBook(list.get(j).getBook());
                        list.get(i).setRating(list.get(j).getRating());
                        list.get(j).setBook(temp);
                        list.get(j).setRating(rating);
                    }
                }
    
            }
    
        }
    
        private static List<RatingBook> checkName(String name, Thread t) {
            t.start();
            startTime = System.currentTimeMillis();
            List<RatingBook> list = new ArrayList<RatingBook>();
            List<RatingBook> nlist = new ArrayList<RatingBook>();
    
            for (int i = 0; i < new Random().nextInt(10); i++) {
                RatingBook book = new RatingBook();
                bookLibrary bookArray = new bookLibrary();
                book.setBook(bookArray.bookArr1[new Random().nextInt(11)]);
                book.setRating(new Random().nextInt(6));
                list.add(book);
            }
            for (int i = 0; i < list.size(); i++) {
                String book = list.get(i).getBook().toLowerCase();
                showInfor("中转台图书列表:", list.get(i));
                if (book.contains(name)) {
                    showInfor("有该书:", list.get(i));
                    nlist.add(list.get(i));
    
                } else {
                    showInfor("要删除的图书:", list.get(i));
                }
            }
            showList("现在的图书列表:", nlist);
    
            sortBook(nlist);
    
            showList("符合条件的图书列表:", nlist);
            return nlist;
    
        }
    //显示名单的内容
        private static void showList(String string, List<RatingBook> list) {
    
            for (int i = 0; i < list.size(); i++) {
                if (!(list.get(i).getBook().equals(""))) {
                    System.out.println(string + list.get(i).getBook() + " 评分:"
                            + list.get(i).getRating());
                }
    
            }
    
        }
    //让用户输入关键字进行查找
        private static String enterName() {
            BufferedReader name = new BufferedReader(new InputStreamReader(
                    System.in));
            String entername = null;
            try {
                entername = name.readLine().toLowerCase();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return entername;
        }
    //模拟图书馆的生成名单,就是图书馆会根据里面有没有来将中转台传过来的名单进行修改,如果有,就加上中转台里面的评分信息
    private static List<RatingBook> getBook(List<RatingBook> ratingList) { List<RatingBook> bookList = new ArrayList<RatingBook>(); List<RatingBook> nbookList = new ArrayList<RatingBook>(); RatingBook FlagBook = new RatingBook(); FlagBook.setBook(""); nbookList.add(FlagBook); for (int i = 0; i < new Random().nextInt(20); i++) { RatingBook book = new RatingBook(); bookLibrary bookArray = new bookLibrary(); book.setBook(bookArray.bookArr2[new Random().nextInt(13)]); book.setRating(0); bookList.add(book); } for (int i = 0; i < bookList.size(); i++) { for (int j = 0; j < ratingList.size(); j++) { if ((bookList.get(i).getBook().toLowerCase()) .contains((ratingList.get(j).getBook().toLowerCase()))) { bookList.get(i).setRating(ratingList.get(j).getRating()); nbookList.add(bookList.get(i)); } else { nbookList.add(FlagBook); } } } return nbookList; } } //模拟前台服务员小姐常常说的:“现在正在等待中。。”这也是我这里面唯一一个附加的线程! class Call implements Runnable { @Override public void run() { System.out.println("正在检索中"); } }

          运行的结果如:

          java
    正在检索中
    中转台图书列表:javascript 评分:5
    有该书:javascript 评分:5
    中转台图书列表:java 评分:1
    有该书:java 评分:1
    现在的图书列表:javascript 评分:5
    现在的图书列表:java 评分:1
    符合条件的图书列表:javascript 评分:5
    符合条件的图书列表:java 评分:1
    图书馆里的图书列表:java and SQL 评分:1
    图书馆里的图书列表:java and SQL 评分:1
    图书馆里的图书列表:java and SQL 评分:1
    检索所需时间为:
    4

         唉,说是仿真,但是我觉得这里面跟并发一点关系都没有,只是我自己强加上一个线程而已,但是我现在的水平又想不出什么好的主意来,只能先放在博客上,希望哪个大神看到能提个醒,毕竟小弟现在还是新手,很多问题根本就无从下手啊!!!

         经过我的第一次重构后,这次,先就代码的可读性下手,并没有考虑到性能,所以,有关于线程,排序等等,这些东西,先放一边,我就直接上代码:

        

    public class Library {
        @SuppressWarnings("deprecation")
        public static void main(String[] args) throws InterruptedException,
                IOException {
            long endTime = 0;
            String name = enterName();
            Thread t = new Thread(new Call());
            t.start();
            long startTime = System.currentTimeMillis();
            List<RatingBook> doubanList = checkNameAndShowBookInDouban(name);
            List<RatingBook> libraryList = getBookFromLibrary(doubanList, name);
            sortBook(libraryList);
            t.stop();
            endTime = System.currentTimeMillis();
            System.out.println("图书馆里的图书列表:");
            for (int i = 0; i < libraryList.size(); i++) {
                if (!(libraryList.get(i).getBook().equals(""))) {
                    RatingBook book = libraryList.get(i);
                    showInfor(book);
                }
            }
            System.out.println("检索所需时间为:" + "\n" + (endTime - startTime));
        }
    
        private static String enterName() throws IOException {
            BufferedReader name = new BufferedReader(new InputStreamReader(
                    System.in));
            String entername = name.readLine().toLowerCase();
            return entername;
        }
    
        private static List<RatingBook> checkNameAndShowBookInDouban(String name) {
            List<RatingBook> mlist = new ArrayList<RatingBook>();
            List<RatingBook> list = createAndReturnBookInZhongZhuanTai();
            RatingBook[] containsBook = new RatingBook[list.size()];
            RatingBook[] deleteBook = new RatingBook[list.size()];
            System.out.println("中转台图书列表:");
            for (int i = 0; i < list.size(); i++) {
                String book = list.get(i).getBook().toLowerCase();
                showInfor(list.get(i));
                if (book.contains(name)) {
                    containsBook[i] = list.get(i);
                    mlist.add(list.get(i));
                } else {
                    deleteBook[i] = list.get(i);
                }
            }
            System.out.println("中转台符合条件的图书:");
            showInfoOfCheck(containsBook);
            System.out.println("要删除的图书:");
            showInfoOfCheck(deleteBook);
            System.out.println("符合条件的图书列表:");
            showList(mlist);
            return mlist;
        }
    
        private static List<RatingBook> createAndReturnBookInZhongZhuanTai() {
            List<RatingBook> list = new ArrayList<RatingBook>();
            for (int i = 0; i < returnIndex(10); i++) {
                RatingBook book = new RatingBook();
                bookLibrary bookArray = new bookLibrary();
                book.setBook(bookArray.doubanBookList[returnIndex(11)]);
                book.setRating(returnIndex(6));
                list.add(book);
            }
            return list;
        }
    
        private static int returnIndex(int i) {
            return new Random().nextInt(i);
        }
    
        private static void showInfor(RatingBook book) {
            if (book == null) {
            } else {
                System.out.println(book.getBook() + " 评分:" + book.getRating());
            }
        }
    
        private static void showInfoOfCheck(RatingBook[] BookArr) {
            for (int i = 0; i < BookArr.length; i++) {
                showInfor(BookArr[i]);
            }
        }
    
        private static void showList(List<RatingBook> list) {
            sortBook(list);
            for (int i = 0; i < list.size(); i++) {
                if (!(list.get(i).getBook().equals(""))) {
                    System.out.println(list.get(i).getBook() + " 评分:"
                            + list.get(i).getRating());
                }
            }
        }
    
        private static void sortBook(List<RatingBook> list) {
            List<RatingBook> mlist = removeSameBook(list);
            sortBookByRating(mlist);
        }
    
        private static List<RatingBook> removeSameBook(List<RatingBook> list) {
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    if ((list.get(i).getBook()).equals(list.get(j).getBook())) {
                        list.remove(j);
                    }
                }
            }
            return list;
        }
    
        private static void sortBookByRating(List<RatingBook> list) {
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    if ((list.get(i).getRating()) <= (list.get(j).getRating())) {
                        String temp = list.get(i).getBook();
                        int rating = list.get(i).getRating();
                        list.get(i).setBook(list.get(j).getBook());
                        list.get(i).setRating(list.get(j).getRating());
                        list.get(j).setBook(temp);
                        list.get(j).setRating(rating);
                    }
                }
    
            }
        }
    
        private static List<RatingBook> getBookFromLibrary(List<RatingBook> list,
                String name) {
            List<RatingBook> bookList = new ArrayList<RatingBook>();
            List<RatingBook> mBookList = new ArrayList<RatingBook>();
            for (int i = 0; i < returnIndex(12); i++) {
                RatingBook book = new RatingBook();
                bookLibrary bookArray = new bookLibrary();
                book.setBook(bookArray.libraryBookList[returnIndex(13)]);
                book.setRating(0);
                bookList.add(book);
            }
            for (int i = 0; i < bookList.size(); i++) {
                if ((bookList.get(i).getBook()).contains(name)) {
                    mBookList.add(bookList.get(i));
                }
            }
            for (int i = 0; i < mBookList.size(); i++) {
                for (int j = 0; j < list.size(); j++) {
                    if ((mBookList.get(i).getBook())
                            .equals((list.get(j).getBook()))) {
                        mBookList.get(i).setRating(list.get(j).getRating());
                    }
                }
            }
            return mBookList;
        }
    }

          然后我就是将那个Runnable类移到其他文件里,就是这样,不知道大家认为可读性是不是比以前提高了,代码运行效果如下:
          java
    正在检索中
    中转台图书列表:
    java and c 评分:1
    sql 评分:5
    INT 评分:1
    INT 评分:5
    ZHENGWENBIAO 评分:3
    javascript 1 评分:3
    中转台符合条件的图书:
    java and c 评分:1
    javascript 1 评分:3
    要删除的图书:
    sql 评分:5
    INT 评分:1
    INT 评分:5
    ZHENGWENBIAO 评分:3
    符合条件的图书列表:
    javascript 1 评分:3
    java and c 评分:1
    图书馆里的图书列表:
    javascript 评分:0
    检索所需时间为:
    4

  • 相关阅读:
    用最有效率的方法计算2乘以8?
    Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
    swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
    &和&&的区别?
    int和Integer有什么区别?
    Java有没有goto?
    collect diff() 方法
    contains() 指定集合中是否含有此项目
    collect集合实例方法 将多个数组组成的集合合成单个一维数组集合-- collapse
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2687009.html
Copyright © 2011-2022 走看看