网页评论实现

业务需求:开发一个评论界面。可以在评论上追加评论(子评论)。

场景模拟:

帖子内容:  关于房价增长快速问题的处理。

评论:

1     房价涨的太快了。

      1.1      都是政府和开发商合谋圈钱。

     1.1.1   老百姓,能吃上饱饭就可以了。

分析:

评论形式是tree结构,我们选择使用tree形式的json数据实现。集合对象中必须包含:

Id:当前评论id,cpid:上级评论id,text:当前评论内容。

备注:以下代码只是java模拟,真实情况评论是要显示到html页面中的可以按照这个逻辑开发前端页面。

代码开发:

public static void main(String[] args){


    List<Map<String,String>> lists = new ArrayList<Map<String,String>>();

    Map<String,String>  map1 = new HashMap<>();
    map1.put("id","1");
    map1.put("cpid","0");
    map1.put("text","房价涨的太快了。");

    Map<String,String>  map2 = new HashMap<>();
    map2.put("id","2");
    map2.put("cpid","1");
    map2.put("text","都是政府和开发商合谋圈钱。");


    Map<String,String>  map3 = new HashMap<>();
    map3.put("id","3");
    map3.put("cpid","2");
    map3.put("text","老百姓,能吃上饱饭就可以了。");

    lists.add(map1);
    lists.add(map2);
    lists.add(map3);
    List<Map<String,String>> listUp = new ArrayList<Map<String,String>>();
    List<Map<String,String>> listTemp = new ArrayList<Map<String,String>>();
    for (int i= 0; i < lists.size();i++){
        Map<String,String>  map = lists.get(i);
        if(map.get("cpid")=="0"){
            listUp.add(map);
            lists.remove(i);
            System.out.println(map.get("text"));
        }
    }

    ItentorMap(listUp,lists,listTemp);


}

private static void ItentorMap(List<Map<String,String>> listUp,List<Map<String,String>> listDown,List<Map<String,String>> listTemp){
    System.out.println("listUp:"+System.identityHashCode(listUp));
    System.out.println("listTemp:"+System.identityHashCode(listTemp));
    listTemp.clear();
    for (int i=0; i<listUp.size(); i++){
        Map<String,String>  map = listUp.get(i);
        for(int j = 0; j < listDown.size(); j++){
            Map<String,String>  mapj = listDown.get(j);
            if(map.get("id")==mapj.get("cpid")){
                listTemp.add(mapj);
                listDown.remove(j);
                System.out.println(mapj.get("text"));
            }
        }

    }
    listUp.clear();
   // 必须这样写,如果写成listUp=listTemp,会导致2个list集合的内存地址一样。
    for (int i = 0;i<listTemp.size(); i++){
        listUp.add(listTemp.get(i));
    }
    System.out.println("listUp:"+System.identityHashCode(listUp));
    System.out.println("listTemp:"+System.identityHashCode(listTemp));

    if(listDown.size()>0) {
        ItentorMap(listUp, listDown, listTemp);
    }
}

遇到的问题:

如果2个list之间使用=负责,会导致2个list的指向内存地址一样,最终结果是2个list完全一样,要变都变的结果。

导致内存地址一样的写法:

  listUp=listTemp

不改变内存地址赋值的几种写法:

方式一:

for (int i = 0;i<listTemp.size(); i++){
        listUp.add(listTemp.get(i));
    }

方式二:

listUp.addAll(listTemp);

方式三:(不推荐)

缺点:每次赋值都会产生新的内存地址

listUp = new ArrayList<>(listTemp);

方式四:(不推荐)

缺点:声明是必须是ArrayList<String> lists = new ArrayList(); 且如果是ArrayList<Map<String,String>>存在类型转换问题。

listUp = listTemp.clone();

原文地址:https://www.cnblogs.com/gynbk/p/10442371.html