RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1427004
Accepted
YuriiS
YuriiS
Asked:2022-09-06 05:17:56 +0000 UTC2022-09-06 05:17:56 +0000 UTC 2022-09-06 05:17:56 +0000 UTC

排序失败

  • 772

我有这个任务:

我得到一个书名列表作为输入。分发书籍,使每个书架上的书籍数量大致相同。书籍应按字母顺序从第一个书架到最后一个书架排序。架子的数量是恒定的 5 件。归还整理在书架上的书籍

private static List<ArrayList<Book>> getShelvesOfBooks(List<Book> books){

        List<Book> sortedBooks = books.stream()
                                .sorted(Comparator.comparing(Book::getName))
                                .collect(Collectors.toList());

        List<ArrayList<Book>> shelves = new ArrayList<>();
        ArrayList<Book> shelf1 = new ArrayList<>();
        ArrayList<Book> shelf2 = new ArrayList<>();
        ArrayList<Book> shelf3 = new ArrayList<>();
        ArrayList<Book> shelf4 = new ArrayList<>();
        ArrayList<Book> shelf5 = new ArrayList<>();

        for (int i = 0; i < sortedBooks.size(); i++) {
            if (i % 5 == 0){
                shelf1.add(sortedBooks.get(i));
            }
            if (i % 5 == 1){
                shelf2.add(sortedBooks.get(i));

            }
            if (i % 5 == 2){
                shelf3.add(sortedBooks.get(i));

            }
            if (i % 5 == 3){
                shelf4.add(sortedBooks.get(i));

            }
            if (i % 5 == 4){
                shelf5.add(sortedBooks.get(i));

            }
        }

        shelves.add(shelf1);
        shelves.add(shelf2);
        shelves.add(shelf3);
        shelves.add(shelf4);
        shelves.add(shelf5);

        return shelves;
    }

在这种情况下,书籍按字母顺序排序,但最终以错误的顺序出现在书架上。

shelf1 = [Book[name='Java в действии'], Book[name='Повесть о настоящем человеке']]
shelf2 = [Book[name='Аэропорт'], Book[name='Сказки']]
shelf3 = [Book[name='Война и мир'], Book[name='Собака Баскервилей']]
shelf4 = [Book[name='Игра престолов'], Book[name='Том Сойер']]
shelf5 = [Book[name='Мастер и Маргарита'], Book[name='Цитадель']]

排序后如何下订单

shelf1 = [Book[name='Java в действии'], [name='Аэропорт']]
shelf2 = [Book[name='Война и мир'], Book[name='Игра престолов']]
shelf3 = [Book[name='Мастер и Маргарита'], Book[name='Повесть о настоящем человеке']]
...

动作的算法会有所不同。可能有必要在将书插入书架之前进行动态分类。我只是不知道如何做到这一点,而且每个书架上仍然有大约相同数量的书籍。当书的数量不是 5 的倍数时,必须从第一个书架开始添加。也就是说,如果有 7 本书,那么第一层和第二层书架上会有两本书,其他书架上有一本。

java сортировка
  • 3 3 个回答
  • 81 Views

3 个回答

  • Voted
  1. Best Answer
    tym32167
    2022-09-06T06:13:28Z2022-09-06T06:13:28Z

    直接提前计算每个书架的书的一些常数是行不通的,否则第一个书架可以装满,最后一个书架是空的。

    因此,我建议在放东西之前重新计算每个书架的书数。

    例子

    private static List<ArrayList<String>> getShelvesOfBooks(List<String> books) {
    
        books = books.stream()
                     .sorted()
                     .collect(Collectors.toList());
    
        List<ArrayList<String>> shelves = new ArrayList<>();
    
        for (int i = 0; i < 5; i++) {
            ArrayList<String> shelf = new ArrayList<>();
            shelves.add(shelf);
        }
    
        int ind = 0;
        int shelfInd = 0;
    
        while (ind < books.size()) {
            int perShelf = getBooksPerShelf(books.size() - ind, shelves.size() - shelfInd);
            for (int i = 0; i < perShelf; i++) {
                shelves.get(shelfInd).add(books.get(ind));
                ind++;
            }
            shelfInd++;
        }
    
        return shelves;
    }
    

    数书架上小学

    static int getBooksPerShelf(int books, int shelves) {
        int perShelf = books / shelves;
        if (perShelf * shelves < books)
            perShelf++;
        return perShelf;
    }
    

    考试

        List<String> books = new ArrayList<>();
        books.add("Java в действии");
        books.add("Повесть о настоящем человеке");
        books.add("Аэропорт");
        books.add("Сказки");
        books.add("Война и мир");
        books.add("Собака Баскервилей");
        books.add("Игра престолов");
        books.add("Том Сойер");
        books.add("Мастер и Маргарита");
        books.add("Цитадель");
        books.add("Цитадель");
    
        List<ArrayList<String>> ret = getShelvesOfBooks(books);
    
        ret.stream().forEach(System.out::println);
    

    结论

    [Java в действии, Аэропорт, Война и мир]
    [Игра престолов, Мастер и Маргарита]
    [Повесть о настоящем человеке, Сказки]
    [Собака Баскервилей, Том Сойер]
    [Цитадель, Цитадель]
    
    • 3
  2. tym32167
    2022-09-06T06:34:55Z2022-09-06T06:34:55Z

    评论提到了第二种解决方案。什托什。

    这个想法是首先准确计算每个书架上会有多少本书。然后把剩下的书一一排列在书架上。

    代码会比我的下一个答案略短

    private static List<ArrayList<String>> getShelvesOfBooks(List<String> books) {
    
        books = books.stream()
                     .sorted()
                     .collect(Collectors.toList());
    
        List<ArrayList<String>> shelves = new ArrayList<>();
    
        for (int i = 0; i < 5; i++) {
            ArrayList<String> shelf = new ArrayList<>();
            shelves.add(shelf);
        }
    
        int ind = 0;
    
        int perShelf = books.size() / shelves.size();
        int remainder = books.size() % shelves.size();
    
        for (List<String> shelve : shelves) {
            for (int i = 0; i < perShelf; i++)
                shelve.add(books.get(ind++));
            if (remainder-- > 0)
                shelve.add(books.get(ind++));
        }
    
        return shelves;
    }
    

    考试

        List<String> books = new ArrayList<>();
        books.add("Java в действии");
        books.add("Повесть о настоящем человеке");
        books.add("Аэропорт");
        books.add("Сказки");
        books.add("Война и мир");
        books.add("Собака Баскервилей");
        books.add("Игра престолов");
        books.add("Том Сойер");
        books.add("Мастер и Маргарита");
        books.add("Цитадель");
        books.add("Цитадель");
    
        List<ArrayList<String>> ret = getShelvesOfBooks(books);
    
        ret.stream().forEach(System.out::println);
    

    结论

    [Java в действии, Аэропорт, Война и мир]
    [Игра престолов, Мастер и Маргарита]
    [Повесть о настоящем человеке, Сказки]
    [Собака Баскервилей, Том Сойер]
    [Цитадель, Цитадель]
    
    • 1
  3. Alex Krass
    2022-09-06T07:00:34Z2022-09-06T07:00:34Z

    我会提前计算书架上有多少本书,int bookPerShelf = sortedBooks.size() / shelves.size()需要添加多少书架int shelfWithExtraBook = sortedBooks.size() % shelves.size()。

    大约我们得到 17 / 5 = 3 - 每个书架上有三本书,17% 5 = 2 - 在前两个书架上再加 1 本书。然后只需在每个架子上按顺序排列所需的数量。

    private static List<ArrayList<Book>> getShelvesOfBooks(List<Book> books){
        var sortedBooks = books.stream()
                .sorted(Comparator.comparing(Book::getName))
                .collect(Collectors.toList());
    
        var shelves = IntStream
                .range(0,5)
                .mapToObj(x -> new ArrayList<Book>())
                .collect(Collectors.toList());
    
        int bookPerShelf = sortedBooks.size() / shelves.size();
        int shelfWithExtraBook = sortedBooks.size() % shelves.size();
    
        int skip = 0;
        for (int i = 0; i < shelves.size(); i++) {
            var limit = bookPerShelf + (i + 1 <= shelfWithExtraBook ? 1 : 0);
            var currentBooks = sortedBooks.stream()
                    .skip(skip)
                    .limit(limit)
                    .collect(Collectors.toList());
            skip += limit;
            shelves.get(i).addAll(currentBooks);
        }
    
        return shelves;
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5