使用集合保存“最近浏览商品” 完美实现商品显示顺序 但性能不高

Posted 乔克叔叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用集合保存“最近浏览商品” 完美实现商品显示顺序 但性能不高相关的知识,希望对你有一定的参考价值。

自己做项目时的代码记录  方式比较笨拙  但可以完成需要的效果【“最近浏览”的商品信息  时刻都在最近浏览界面窗口的第一位置】

    //3.根据商品id 查询一件商品  同时把当前商品设计进集合中  用来完成浏览记录功能
    public String productDetail()throws Exception{
        //传递的是商品对应的id
        Product product=this.productService.productDetail(model);
        ActionContext.getContext().put("product",product);
        
        //------------------------------
        //最近浏览商品的功能  使用session保存用户点击的商品  模拟‘浏览记录’功能
        //1.使用LinkedHashMap  非线程安全  有序
        Map<String,Product> history=(Map<String, Product>) ServletActionContext.getRequest().getSession().getAttribute("history");
        if(history==null){
            history=new LinkedHashMap<String,Product>();
        }
        //判断集合中是否存在当前浏览的商品对象
        if(history.containsKey(model.getEp_id())){
            //把对象移除  然后再下面重新添加
            history.remove(model.getEp_id());
        }
        history.put(model.getEp_id(),product);
        //把数据保存在session域中  在整个会话期间都有效
        ServletActionContext.getRequest().getSession().setAttribute("history", history);
        //以上代码  保证  最后的对象  都是刚刚浏览过的  但是输出显示的时候  是从第一个开始
        //(页面显示顺序:最先浏览的永远在第一个  最近浏览的永远在最后一个)   所以要对集合进行逆序设计
        //------------------------------
        
        //对对象集合进行倒序设计
        Set<String> keySet = history.keySet();
        //转为ArrayList集合
        List<String> list=new ArrayList<String>();
        list.addAll(keySet);
        //然后倒序取出list集合中的数据(key)
        int t=0;//规定页面上显示的浏览历史  最多存在5个
        List<String> listfive=new ArrayList<String>();
        for(int i=list.size()-1;i>=0;i--){
            //找出最后边的key  找出5个
            //System.out.println(list.get(i));
            if(t<5){
                if(list.get(i)!=null){
                    listfive.add(list.get(i));
                }
            }else{
                break;
            }
            t++;
        }
        //以上代码  保证:list集合中存放的都是逆序之后的数据   而且最多取5条 
        //即从最后往前取5个  set集合中的最后一个key永远放在list中的第一个位置(下标0)
        
        //定义新的linkedHashMap 存放的数据都是最进点击过的商品
        Map<String,Product> MP=new LinkedHashMap<String,Product>();
        for(int i=0;i<listfive.size();i++){
            if(listfive.get(i)!=null){
                MP.put(listfive.get(i),history.get(listfive.get(i)));
            }
        }
        //以上程序虽然完成了功能  但是性能不高
        ServletActionContext.getRequest().getSession().setAttribute("MP", MP);
        //页面中使用MP中保存的对象进行显示  (页面显示顺序:最先浏览的永远在最后一个  最近浏览的永远在第一个) 
        
        return "productDetail";
    }

 ------------------------------------

上面的方法是在集合中找到了最后的5个对象  我们也可以不在集合中设计页面显示对象的个数  而是把所有的商品对象都逆序  之后  返回给页面  在页面上控制输出的个数即可

//3.根据商品id 查询一件商品  同时把当前商品设计进集合中  用来完成浏览记录功能
    public String productDetail()throws Exception{
        //传递的是商品对应的id
        Product product=this.productService.productDetail(model);
        ActionContext.getContext().put("product",product);
        
        //------------------------------
        //最近浏览商品的功能  使用session保存用户点击的商品  模拟‘浏览记录’功能
        //1.使用LinkedHashMap  非线程安全  有序
        Map<String,Product> history=(Map<String, Product>) ServletActionContext.getRequest().getSession().getAttribute("history");
        if(history==null){
            history=new LinkedHashMap<String,Product>();
        }
        //判断集合中是否存在当前浏览的商品对象
        if(history.containsKey(model.getEp_id())){
            //把对象移除  然后再下面重新添加
            history.remove(model.getEp_id());
        }
        history.put(model.getEp_id(),product);
        //把数据保存在session域中  在整个会话期间都有效
        ServletActionContext.getRequest().getSession().setAttribute("history", history);
        //以上代码  保证  最后的对象  都是刚刚浏览过的  但是输出显示的时候  是从第一个开始
        //(页面显示顺序:最先浏览的永远在第一个  最近浏览的永远在最后一个)   所以要对集合进行逆序设计
        //------------------------------
        
        //对对象集合进行倒序设计
        Set<String> keySet = history.keySet();
        //转为ArrayList集合
        List<String> list=new ArrayList<String>();
        list.addAll(keySet);
        //然后倒序取出list集合中的数据(key)
        //int t=0;//规定页面上显示的浏览历史  最多存在5个
        List<String> listfive=new ArrayList<String>();
        for(int i=list.size()-1;i>=0;i--){
            /*
            //找出最后边的key  找出5个
            //System.out.println(list.get(i));
            if(t<5){
                if(list.get(i)!=null){
                    listfive.add(list.get(i));
                }
            }else{
                break;
            }
            t++;
            */
            //不在这里进行个数设计  这里全部key倒序设置进集合中   然后 在页面进行个数设计
            listfive.add(list.get(i));
        }
        //以上代码  保证:list集合中存放的都是逆序之后的数据   而且最多取5条 
        //即从最后往前取5个  set集合中的最后一个key永远放在list中的第一个位置(下标0)
        
        //定义新的linkedHashMap 存放的数据都是最进点击过的商品
        Map<String,Product> MP=new LinkedHashMap<String,Product>();
        for(int i=0;i<listfive.size();i++){
            if(listfive.get(i)!=null){
                MP.put(listfive.get(i),history.get(listfive.get(i)));
            }
        }
        //以上程序虽然完成了功能  但是性能不高
        ServletActionContext.getRequest().getSession().setAttribute("MP", MP);
        //页面中使用MP中保存的对象进行显示  (页面显示顺序:最先浏览的永远在最后一个  最近浏览的永远在第一个) 
        
        return "productDetail";
    }

页面:

这样就只输出集合中的第0个(下标)到第4个元素(下标为4)  就控制了显示的个数为5个商品对象

 

以上是关于使用集合保存“最近浏览商品” 完美实现商品显示顺序 但性能不高的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb学习记录(十四)——商城购物之字符串拼接实现最近浏览商品和购物车的功能

编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理

Java中的map集合顺序如何与添加顺序一样

portal商品展示功能逻辑

(java实现)顺序表-ArrayList

List集合