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

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

/**
     * 验证excel每行数据方法一
     * rowData下一条数据
     * rowDatas excel表格所有数据
     * splicingValue excel中某一行的某一列数据
     **/
    public void validateRowData(List rowDatas, List 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() + "列完全相同" + "
"); } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) { errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列不能和第" + data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "
"); } else { errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" + rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data.getUsccColumn() + "列、第" + data.getMonthColumn() + "列完全相同" + "
"); } } else { //rowDatas.add(rowData); //在for循环里面添加数据是错误的,切记!! //集合去重并且按照自然顺序排列 rowDatasCopy.add(rowData); List 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 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() + "列完全相同" +
                                        "
"); } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) { errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列不能和第" + data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "
"); } else { errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" + rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data .getUsccColumn() + "列、第" + data.getMonthColumn() + "列完全相同" + "
"); } } } } } } //验证excel表格中数据与数据库中数据 Map map = new HashMap(); map = CommonUtil.convertFormData(map); validateRowData1(rowDatas, entityName, map); }

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

    if (list.contains(cellValue)) {
        errorString.append("第" + curRow + "行,第" + curCol + "列:" + rulMsg + "
"); } else { list.add(cellValue); }

你可能感兴趣的:(校验表格中行与行之间是否有某一列或者某几列重复数据)