校验表格中行与行之间是否有某一列或者某几列重复数据

2018-02-04  本文已影响30人  墨色尘埃

方法一:每读取一行数据就放入集合,该行数据和集合作比对(行数多的时候会卡死),如果该行数据没有和集合中的数据重复就添加进集合,但是有一个问题,如果直接添加进集合A会导致数组越界(不能在for循环里面再添加数据到集合中),所以将该数据添加进新集合B,等A集合循环结束后清空A,将B赋值给A。动态添加会容易导致问题

/**
     * 验证excel每行数据方法一
     * rowData下一条数据
     * rowDatas excel表格所有数据
     * splicingValue excel中某一行的某一列数据
     **/
    public void validateRowData(List<RowData> rowDatas, List<RowData> rowDatasCopy,
                                RowData rowData, String splicingValue, String entityName) {
        rowDatas.clear();
        rowDatas.addAll(rowDatasCopy);
        if (rowDatas != null && rowDatas.size() > 0) {
            for (RowData data : rowDatas) {   //data上一条数据
                if (splicingValue != null && !"".equals(splicingValue)) {
                    if (splicingValue.equals(data.getSplicingValue())) {
                        if (entityName.equals(ParseConstans.ENTERPRISE_INVEST_DETAIL)) {
                            errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                    rowData.getMonthColumn() + "列、第" + rowData.getTypeColumn() + "列不能和第" +
                                    data.getRow() + "行第" + data.getUsccColumn() +
                                    "列、第" + data.getMonthColumn() + "列、第" + data.getTypeColumn() + "列完全相同" + "<br>");
                        } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) {
                            errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列不能和第" +
                                    data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "<br>");
                        } else {
                            errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                    rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data.getUsccColumn() +
                                    "列、第" + data.getMonthColumn() + "列完全相同" + "<br>");
                        }
                    } else {
                        //rowDatas.add(rowData); //在for循环里面添加数据是错误的,切记!!
                        //集合去重并且按照自然顺序排列
                        rowDatasCopy.add(rowData);
                        List<RowData> newList = new ArrayList<>(new TreeSet<>(rowDatasCopy));
                        rowDatasCopy.clear();
                        rowDatasCopy.addAll(newList);
                    }
                }
            }
        } else {
            rowDatas.add(rowData);
            rowDatasCopy.add(rowData);
        }
    }

方法二:将excel表格所有数据存放到集合中,对集合进行双重for循环(效率高)。不像方法一,这种方法比较起来更加高效快捷。

 /**
     * 验证excel每行数据方法二
     * rowDatas excel表格中所有数据
     **/
    public void validateRowData(List<RowData> rowDatas, String entityName) {
        for (RowData rowData : rowDatas) {
            String splicingValue = rowData.getSplicingValue();
            int row = rowData.getRow();
            if (splicingValue != null && !"".equals(splicingValue)) {
                for (RowData data : rowDatas) {
                    if (row != data.getRow()) {
                        if (splicingValue.equals(data.getSplicingValue())) {
                            if (entityName.equals(ParseConstans.ENTERPRISE_INVEST_DETAIL)) {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                        rowData.getMonthColumn() + "列、第" + rowData.getTypeColumn() + "列不能和第" +
                                        data.getRow() + "行第" + data.getUsccColumn() +
                                        "列、第" + data.getMonthColumn() + "列、第" + data.getTypeColumn() + "列完全相同" +
                                        "<br>");
                            } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() +
                                        "列不能和第" +
                                        data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "<br>");
                            } else {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                        rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data
                                        .getUsccColumn() +
                                        "列、第" + data.getMonthColumn() + "列完全相同" + "<br>");
                            }
                        }
                    }
                }
            }
        }

        //验证excel表格中数据与数据库中数据
        Map map = new HashMap();
        map = CommonUtil.convertFormData(map);
        validateRowData1(rowDatas, entityName, map);
    }

注:如果只是对行与行之间的某一列进行重复校验,那么就更简单了,只需要将该列数据放入集合

    if (list.contains(cellValue)) {
        errorString.append("第" + curRow + "行,第" + curCol + "列:" + rulMsg + "<br>");
    } else {
        list.add(cellValue);
    }
上一篇下一篇

猜你喜欢

热点阅读