中软国际暑期实习day13(2020.08.22)-Spring Boot项目实战(新闻项目-归档功能)

今天在昨天的基础上完成归档功能(即在首页可以按标签、按类别分类展示新闻及对新闻按年份进行归档)。

1.按类别分类展示新闻

在首页按类别分类展示新闻,找到所有的分类 ,并且按照新闻量自上而下排序,其核心代码如下所示

@GetMapping("/types/{id}")
    public String types(@PageableDefault(size = 5, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
                       @PathVariable long id, Model model) {
        // 1. 找到所有的分类  并且按照新闻量自上而下排序
        List<Type> list = typeService.listTypeTop(10000);

        if (id == -1) {
            // 意味着当前第一次访问  访问的分类应是新闻量最多的那个标签
            id = list.get(0).getId();
        }
        model.addAttribute("types", list);
        model.addAttribute("page", newsService.listNews(id, pageable));
        model.addAttribute("activeTypeId", id);
        return "types";
    }

2.按标签分类展示新闻

与按类别展示类似。

@GetMapping("/tags/{id}")
    public String tags(@PageableDefault(size = 5, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable,
                       @PathVariable long id, Model model) {
        // 1. 找到所有的标签  按照新闻量从上而下进行排序
        List<Tag> list = tagService.listTagTop(1000);

        // 2. 判断当前是否为第一次访问, 若是  就显示新闻量最多的标签
        if (id == -1) {
            id = list.get(0).getId();
        }

        model.addAttribute("tags", list);
        model.addAttribute("page", newsService.listTagsNews(id, pageable));
        model.addAttribute("activeTagId", id);
        return "tags";
    }

3.归档

按照年份归档新闻,注意新闻数量,其核心代码如下

@GetMapping("/archives")
    public String archives(Model model) {
        //  需要通过 map 集合存储 年份 和新闻     Map<年份, 新闻的集合>
        model.addAttribute("archiveMap", newsService.arvhiveMap());
        model.addAttribute("newsCount", newsService.countNews());
        return "archives";
    }
@Override
    public Map<String, List<News>> arvhiveMap() {
        // 1. 得到所有的年份
        List<String> list = newsRepository.findGroupByYear();
        System.out.println(list);
        // 2. 创建map集合
        Map<String, List<News>> map = new LinkedHashMap<>();
        // 3. 将键值对存储至map集合中
        for (String year : list) {
            map.put(year, newsRepository.findByYear(year));
        }
        System.out.println(map);
        return map;
    }

    @Override
    public Long countNews() {
        return newsRepository.count();
    }

4.总结

在完成归档功能时,新闻不能很好的按年份顺序进行展示,主要原因是用了HashMap,后来改用LinkedHashMap,解决了这个问题。

Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。

HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;

HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。

如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。

在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值