我有这个任务:
我得到一个书名列表作为输入。分发书籍,使每个书架上的书籍数量大致相同。书籍应按字母顺序从第一个书架到最后一个书架排序。架子的数量是恒定的 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 本书,那么第一层和第二层书架上会有两本书,其他书架上有一本。