diff --git a/src/main/java/com/auxiliary/tool/data/ListUtil.java b/src/main/java/com/auxiliary/tool/data/ListUtil.java index 5099d1a..cf82df4 100644 --- a/src/main/java/com/auxiliary/tool/data/ListUtil.java +++ b/src/main/java/com/auxiliary/tool/data/ListUtil.java @@ -2,6 +2,7 @@ package com.auxiliary.tool.data; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -20,7 +21,7 @@ import java.util.stream.Collectors; * 编码时间:2020年12月22日上午8:27:07 *

*

- * 修改时间:2020年12月22日上午8:27:07 + * 修改时间:2021年2月20日上午7:20:37 *

* * @author 彭宇琦 @@ -145,10 +146,10 @@ public class ListUtil { /** * 用于对列表中的数据类型进行转换,返回新数据类型的列表 * - * @param 原数据类型 - * @param 新数据类型 + * @param 原数据类型 + * @param 新数据类型 * @param tableData 原数据类型表 - * @param mapper 数据转换方式 + * @param mapper 数据转换方式 * @return 转换后的数据类型表 */ public static TableData changeTable(TableData tableData, Function mapper) { @@ -156,6 +157,76 @@ public class ListUtil { tableData.columnForEach((key, value) -> newTable.addColumn(key, changeList(value, mapper).stream() .map(dataOptional -> dataOptional.orElse(null)).collect(Collectors.toList()))); return newTable; + + } + + /** + * 用于对集合中的元素进行去重 + *

+ * 注意:被比较的泛型对象去重按照equals()方法进行比较,需要正确实现equals()方法,才能达到去重的目的 + *

+ * + * @param 需要去重的数据类型 + * @param list 需要去重的集合 + * @return 去重后的集合 + */ + public static List> removeRepetition(List> list) { + LinkedHashSet> set = new LinkedHashSet<>(); + Optional.ofNullable(list).filter(l -> !l.isEmpty()).ifPresent(l -> l.forEach(set::add)); + + return new ArrayList>(set); + } + + /** + * 用于根据指定的条件行对表中的数据进行去重 + *

+ * 方法需要指定列名,表示以指定的列为基准,对数据进行去重。类似于数据库中指定字段为主键或联合主键。 + * 当指定的列的数据重复时,将舍弃该数据所在行的整行数据,达到去重的目的 + *

+ *

+ * 注意: + *

    + *
  1. 被比较的泛型对象去重按照equals()方法进行比较,需要正确实现equals()方法
  2. + *
  3. 被舍弃的数据不区分其他内容,只保留第一次存储的数据
  4. + *
+ *

+ * + * @param 需要去重的数据类型 + * @param tableData 需要去重的表 + * @param columns 作为条件的列名称 + * @return 去重后的表 + */ + public static TableData removeRepetition(TableData tableData, String... columns) { + //若传入的条件为空,则直接返回传入的tableData + if (!Optional.ofNullable(columns).filter(cs -> cs.length != 0).isPresent()) { + return tableData; + } + //定义新的表数据,并初始化其标题 + TableData nowTable = new TableData<>(); + + //按行遍历tableData的所有数据,过滤掉与nowTable中指定行数据一致的行数据,之后添加未被过滤的数据 + Optional.ofNullable(tableData).filter(td -> !td.isEmpty()).ifPresent(td -> { + nowTable.addTitle(tableData.getColumnName()); + td.rowStream().filter(list -> { + boolean isRepeat = true; + for (String column : columns) { + //获取指定列数据,若新表中该列的数据包含了当前的数据,则返回false + if (nowTable.getColumnList(column).contains(list.get(tableData.getFieldIndex(column)))) { + isRepeat = true; + continue; + } else { + isRepeat = false; + break; + } + } + + //返回不重复的结果 + return !isRepeat; + //由于返回的元素为封装类对象,需要对元素脱壳处理。处理方式为直接返回即可 + }).map(list -> list.stream().map(e -> e.get()).collect(Collectors.toList())).forEach(nowTable::addRow); + }); + + return nowTable; } } diff --git a/src/main/java/com/auxiliary/tool/data/TableData.java b/src/main/java/com/auxiliary/tool/data/TableData.java index ae4b7db..c069413 100644 --- a/src/main/java/com/auxiliary/tool/data/TableData.java +++ b/src/main/java/com/auxiliary/tool/data/TableData.java @@ -24,7 +24,7 @@ import java.util.stream.Stream; * 编码时间:2020年12月17日上午8:24:47 *

*

- * 修改时间:2020年12月17日上午8:24:47 + * 修改时间:2021年2月19日下午6:39:48 *

* * @author 彭宇琦 @@ -367,8 +367,8 @@ public class TableData { * @return 指定列的所有数据 */ public ArrayList> getColumnList(String columnName) { - columnName = Optional.ofNullable(columnName).filter(tableMap::containsKey) - .orElseThrow(() -> new IllegalDataException("不存在的元素列")); + Optional.ofNullable(columnName).filter(tableMap::containsKey) + .orElseThrow(() -> new IllegalDataException("不存在的元素列:" + columnName)); ArrayList> columnDataList = new ArrayList<>(); columnDataList.addAll(tableMap.get(columnName)); @@ -393,7 +393,7 @@ public class TableData { public Optional getFirstData() { return getFirstColumn().get(0); } - + /** * 用于获取指定列与指定列的数据,并以传入的字段顺序,将获取到的每列数据进行存储 *

@@ -553,7 +553,7 @@ public class TableData { public void columnForEach(BiConsumer>> action) { tableMap.forEach(action); } - + /** * 刷新表中最长与最短列的元素个数,用于清空或删除表时的计算 */ @@ -591,4 +591,9 @@ public class TableData { return index; } } + + @Override + public String toString() { + return "[" + tableMap + "]"; + } }