面向对象多态本身不能直接剔除数组重复元素,但可封装“重复判定规则”为接口equalitystrategy,通过不同实现支持数值、忽略大小写的字符串或自定义对象去重,并结合arrays工具类(如排序、转换)与集合协同完成任务。

用面向对象多态配合 Arrays 工具类本身无法直接剔除数组重复元素——因为 Arrays 类不提供去重方法,且多态解决的是行为抽象问题,而非数据结构操作。但可以借助多态设计灵活的去重策略,并结合 Arrays(如排序、转换)与集合工具协同完成任务。关键在于:把“如何判断重复”这一逻辑交给多态实现,把“数组转集合、去重、再转回数组”这一流程标准化。
用多态封装“重复判定规则”
不同业务中,“重复”的定义可能不同:整数看数值,字符串看忽略大小写,自定义对象可能按 ID 或多个字段组合判断。这时可定义统一接口:
interface EqualityStrategy<t> {
boolean equals(T a, T b);
}</t>
然后为不同场景提供实现:
-
数值型策略:直接用
Objects.equals(a, b) -
忽略大小写字符串策略:调用
String.equalsIgnoreCase() -
用户对象策略:按
id字段比较,或使用Objects.equals(user1.getId(), user2.getId())
借助 Arrays 排序 + 手动遍历去重(适用于已排序或可排序数组)
若数组元素可自然排序(或通过 Comparator 排序),可先用 Arrays.sort(),再单次遍历跳过相邻重复项。此时多态体现在传入的 Comparator ——它本身就是函数式接口,天然支持多态扩展:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 对
String[]:用String.CASE_INSENSITIVE_ORDER - 对
User[]:传入Comparator.comparing(User::getId) - 排序后遍历填充新数组,只保留首个出现的元素即可
通用方案:数组 → List → Stream/LinkedHashSet → 数组
这是最常用且兼顾顺序与扩展性的做法,多态用于构造去重依据:
- 将原数组转为
List(用Arrays.asList()) - 创建
LinkedHashSet并重写其add行为?不行——但可通过Stream.distinct()配合自定义equals/hashCode,或更推荐:提前将元素映射为唯一键 - 例如:用
stream().map(e -> strategy.keyOf(e)).distinct()提取特征键去重,再关联还原原对象 - 最后用
toArray()转回数组(需指定类型,如toArray(new String[0]))
一个简洁可复用的工具方法示例
封装成静态泛型方法,接收数组和策略对象,内部用 LinkedHashSet 保序去重:
public static <t> T[] deduplicate(T[] array, EqualityStrategy<t> strategy) {
if (array == null || array.length == 0) return array;
List<t> list = new ArrayList();
for (T item : array) {
boolean isDuplicate = list.stream()
.anyMatch(existing -> strategy.equals(existing, item));
if (!isDuplicate) list.add(item);
}
@SuppressWarnings("unchecked")
T[] result = (T[]) new Object[list.size()];
return list.toArray(result);
}</t></t></t>
调用时只需传入对应策略实例,无需修改核心逻辑——这正是多态带来的可维护性提升。










