业务需求:开发一个评论界面。可以在评论上追加评论(子评论)。
场景模拟:
帖子内容: 关于房价增长快速问题的处理。
评论:
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();