之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断。
再次介绍一下背景需求:
利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件
1、是否选择学院。
2、数据库里是否已存在该课程代码。
3、多条数据添加时,界面是否有重复的课程代码。
实现方法如下:
1 //遍历code数组是否有重复值 2 ArrayList<String> arrCode=new ArrayList<String>(); 3 //遍历Name数组是否有重复值 4 ArrayList<String> arrName=new ArrayList<String>(); 5 for (int i = 0; i < courseList.size(); i++) { 6 //获得当前course实体 7 Course course = courseList.get(i); 8 9 // 根据学院ID获得学院Code 10 String code = courseService.getCollegeById(collegeId) 11 .getInstitutionCode(); 12 // 设置课程codeBuffer=学院code+课程code 13 StringBuffer codeBuffer = new StringBuffer(); 14 codeBuffer.append(code); 15 codeBuffer.append(course.getCode()); 16 17 // arrCode.add(StringBuffer codeBuffer.toString()); 18 arrCode.add(codeBuffer.toString()); 19 arrName.add(course.getName()); 20 } 21 //-------------------------分割线:判断是否有重复值的hashSet方法----------------------------- 22 //----------------------------------start------------------------------------------------------------ 23 // HashSet<String> hashSet = new HashSet<String>(); 24 // List<String> newlist = new ArrayList<String>(); 25 // for (Iterator iterator = arrCode.iterator(); iterator.hasNext();) { 26 // String element = (String) iterator.next(); 27 // if (hashSet.add(element)) { 28 // newlist.add(element); 29 // } 30 // } 31 // // arrCode.clear(); //如果需要把新的list付给就的list就需要这部分代码,目前不需要 32 // // arrCode.addAll(newlist); 33 // if (newlist.size()!=arrCode.size()) { 34 // outMsg(AjaxObject.newError("课程代码不能重复!").setNavTabId("course_add").toString()); 35 // } 36 //----------------------------------end------------------------------------------------------------ 37 //-------------------------分割线:判断是否有重复值的hashSet方法----------------------------- 38 39 //----------------------------分割线:借助第三个List遍历出重复数据----------------------------------- 40 // 记录重复数据 41 List<String> cflist = new ArrayList<String>(); 42 List<String> cflist2 = new ArrayList<String>(); 43 // 复制一个list 44 List<String> blist = arrCode; 45 List<String> blist2 = arrName; 46 //判断code 47 for (int i = 0; i < arrCode.size(); i++) { 48 boolean b = false; 49 String mk = common.tool.constant.CommonConstant.ADD_FAIL+"课程代码第" + (i + 1) + "条数据和第"; 50 for (int j = 0; j < blist.size(); j++) { 51 // 不和本身比较 52 if (j != i) { 53 // 找到相同的值 54 if (arrCode.get(i).equals(blist.get(j))) { 55 // 不存在重复数据 56 if (!cflist.isEmpty()) { 57 boolean bo = true; 58 // 遍历重复数据集 59 for (int k = 0; k < cflist.size(); k++) { 60 // 取出第k行的重复数据 61 String[] cf = cflist.get(k).toString().split("-"); 62 // 取出第k行的第二个索引(复制数据的索引+1) 63 int s = Integer.parseInt(cf[1].toString()); 64 // 比较当前顺序和重复中的顺序,如果相等则标记为false 65 if (s == (i + 1)) { 66 bo = false; 67 } 68 } 69 // 判断是否添加到重复数据集中(true表示重复数据集里面不存在该数据,false反之) 70 if (bo) { 71 cflist.add((i + 1) + "-" + (j + 1)); 72 if (b) { 73 mk += ","; 74 } 75 mk += (j + 1); 76 // 记录重复数据时修改b的值,表示和第i行和第j行存在重复数据 77 b = true; 78 } 79 } else { 80 // 记录重复的数据,格式为2-3(第一个数字为原重复数据的索引+1,第二个为复制数据的索引+1) 81 cflist.add((i + 1) + "-" + (j + 1)); 82 mk += (j + 1); 83 b = true; 84 } 85 } 86 } 87 } 88 mk += "条数据重复,重复值:" + arrCode.get(i); 89 if (b) { 90 outMsg(AjaxObject.newError(mk).setNavTabId("course_add").toString()); 91 92 System.out.println(mk); 93 return; 94 } 95 } 96 //判断name 97 for (int i = 0; i < arrName.size(); i++) { 98 boolean b = false; 99 String mk = common.tool.constant.CommonConstant.ADD_FAIL+"课程名称第" + (i + 1) + "条数据和第"; 100 for (int j = 0; j < blist2.size(); j++) { 101 // 不和本身比较 102 if (j != i) { 103 // 找到相同的值 104 if (arrName.get(i).equals(blist2.get(j))) { 105 // 不存在重复数据 106 if (!cflist2.isEmpty()) { 107 boolean bo = true; 108 // 遍历重复数据集 109 for (int k = 0; k < cflist2.size(); k++) { 110 // 取出第k行的重复数据 111 String[] cf = cflist2.get(k).toString().split("-"); 112 // 取出第k行的第二个索引(复制数据的索引+1) 113 int s = Integer.parseInt(cf[1].toString()); 114 // 比较当前顺序和重复中的顺序,如果相等则标记为false 115 if (s == (i + 1)) { 116 bo = false; 117 } 118 } 119 // 判断是否添加到重复数据集中(true表示重复数据集里面不存在该数据,false反之) 120 if (bo) { 121 cflist2.add((i + 1) + "-" + (j + 1)); 122 if (b) { 123 mk += ","; 124 } 125 mk += (j + 1); 126 // 记录重复数据时修改b的值,表示和第i行和第j行存在重复数据 127 b = true; 128 } 129 } else { 130 // 记录重复的数据,格式为2-3(第一个数字为原重复数据的索引+1,第二个为复制数据的索引+1) 131 cflist2.add((i + 1) + "-" + (j + 1)); 132 mk += (j + 1); 133 b = true; 134 } 135 } 136 } 137 } 138 mk += "条数据重复,重复值:" + arrName.get(i); 139 if (b) { 140 outMsg(AjaxObject.newError(mk).setNavTabId("course_add").toString()); 141 142 System.out.println(mk); 143 return; 144 } 145 } 146 147 //----------------------------分割线:借助第三个List遍历出重复数据-----------------------------------
具体的实现思路就是将获取到实体List的code取出来,放在一个List里。第一种方法是借助hashSet来完成,因为如果遍历存放代码的CodeList,将它放进hashSet里,HashSet遇到相同的值,就只会添加一条。所以最后比较HashSet的长度和CodeList的长度,如果长度不一样,说明有重复值。第二种方法是利用第三方的List来遍历比较,通过这种方法的好处是一旦出现重复值,我们可以获取到他的索引,可以友好的提示用户,到底批量添加的哪一行和哪一行重复了,重复的值是什么,以方便用户查找修改,充分体现了全心全意为人民服务的宗旨。
以下是效果展示: