我们要求做一个图书馆类的程序,我的做法是对象是图书,然后图书馆就是ArrayList,即把图书对象放进ArrayList。现在的问题是有一个要求是要我们根据作者或者category来打印出所有的图书。即如果按照category打印,一个category相同的所有图书打印过后再打印下个类型的图书。求教大佬怎么实现这个功能
public class test {
@Test
public void testStream(){
ArrayList books = new ArrayList<>();
books.add(new Book("1","1","1"));
books.add(new Book("2","2","2"));
books.add(new Book("3","3","3"));
books.add(new Book("4","4","4"));
String category = "1";
books.stream().forEach(book -> {
if(book.getCategory().equals(category)){
System.out.println(book);
}
});
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Book{
private String title;
private String category;
private String auth;
}
```**如果继续打印其他的类型 可以做个类型集合 遍历**
大概想法是先建一个书的对像,每本书都通过这个对象new出来,之后建一个图书馆的数据组,把每本书的对象都放到数据组,再将数据组安想要的排序,这里用的是数组自己的排序方法,就是自己实现Comparator就可以了
class Book{
String isbn;
String title;
String author;
String category;
String total_copies;
String available_copies;
}
Public void main(){
List library = new ArrayList();
Book book = new Book();
book.isbn= ’730206…..’;
book.title = ‘Data Stru…’;
………..
library.add(book);
Book book1 = new Book();
book1.isbn= ’730206…..’;
book1.title = ‘Data Stru…’;
………..
library.add(book1);
Arrays.sort(library, new MyComprator()); //使用指定的排序器,进行排序
for(int i=0;i<library.size();I++) //输出排序结果
System.out.println(library.get(i).isbn +”,”+library.get(i).title………………);
}
class MyComprator implements Comparator {
public int compare(Object arg0, Object arg1) {
Book t1=(Book)arg0;
Book t2=(Book)arg1;
if(t1.cuthor != t2.cuthor)
return t1.x>t2.x? 1:-1;
else
return t1.y>t2.y? 1:-1;
}
}
图书类别和图书应该是分为两张表的,即作为两个类。要求的是分别依次打印出一个图书类中的所有的图书。那么,就可先获取所有图书类别和所有图书类的图书数据。再将对所有图书类别进行第一层循环,将所有图书类的图书数据作为第二层循环(进行和第一层循环的类别进行匹配,得出此类的图书数据),最终打印即可
先建立一个作者集合结构{作者名称:[书]} HashMap
遍历list,判断作者集合中书否存在此作者,不存在将添加进作者集合。存在将其追加至对应的集合。
在遍历最终集合输出。
代码:
package com.springcloud.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 开发公司:青岛海豚数据技术有限公司
* 版权:青岛海豚数据技术有限公司
* <p>
* test
*
* @author 刘志强
* @created Create Time: 2019/5/5
*/
public class test {
public static void main(String[] a) {
// 创建list集合
List<Shu> list = new ArrayList<>();
Shu shu = new Shu("罗贯中","三国演义", "1");
Shu shu1 = new Shu("吴承恩","西游记", "5");
Shu shu2 = new Shu("曹雪芹","红楼梦", "1");
Shu shu3 = new Shu("施耐庵","水浒传", "2");
Shu shu4 = new Shu("吴承恩","图书1", "3");
Shu shu5 = new Shu("施耐庵","图书1", "1");
Shu shu6 = new Shu("罗贯中","图书2", "3");
Shu shu7 = new Shu("曹雪芹","图书3", "2");
list.add(shu);
list.add(shu1);
list.add(shu2);
list.add(shu3);
list.add(shu4);
list.add(shu5);
list.add(shu6);
list.add(shu7);
// 创建最终结构集合
Map<String,List<Shu>> map = new HashMap<>();
list.forEach(shu8 -> {
// 设置开关函数 on
final boolean[] on = {true};
map.forEach((key,value) -> {
if (key.equals(shu8.getAuthor())) {
value.add(shu8);
on[0] = false;
}
});
// 如果on[0]还为true 证明map中还不存在此作者, 追加此作者
if (on[0]) {
List<Shu> list1 = new ArrayList<>();
list1.add(shu8);
map.put(shu8.getAuthor(), list1);
}
});
// 遍历map
map.forEach((key,value) -> {
value.forEach(shu9 -> {
System.out.println(shu9.toString());
});
});
}
static class Shu {
Shu(String author,String title,String category ) {
this.author = author;
this.title = title;
this.category = category;
}
private String author;
private String title;
private String category;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@Override
public String toString() {
return "Shu{" +
"author='" + author + '\'' +
", title='" + title + '\'' +
", category='" + category + '\'' +
'}';
}
}
}
运行输出结果如下
Shu{author='吴承恩', title='西游记', category='5'}
Shu{author='吴承恩', title='图书1', category='3'}
Shu{author='罗贯中', title='三国演义', category='1'}
Shu{author='罗贯中', title='图书2', category='3'}
Shu{author='曹雪芹', title='红楼梦', category='1'}
Shu{author='曹雪芹', title='图书3', category='2'}
Shu{author='施耐庵', title='水浒传', category='2'}
Shu{author='施耐庵', title='图书1', category='1'}
// Book对象 : category 属性 , getter/setter , toString
bookList.stream().collect(Collectors.groupingBy(Book::getCategory)).forEach((category,books) -> {
System.out.println("----------" + category + "----------");
books.forEach(System.out::println);
});