常用算法篇-集合去重

Posted 小白的梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用算法篇-集合去重相关的知识,希望对你有一定的参考价值。

集合去重

在工作中我们时常需要用到将一个集合中的元素去重的算法,例如如下的场景

我们的需求是 : 月底要开迎新晚会,现在我们已经统计了分别会唱歌的,会跳舞的,会敲代码的学生,然后我们需要把这些会任意才艺表演的学生罗列出来,每人分发小一份礼品

下面我们直接上代码例子来说明:

main方法部分代码

从上图中我们可以看出,我们已经罗列所有会才艺表演的学生,但是姓名有重复,这时候不方便我们分发小礼品,那么我们需要将不重复的姓名罗列出来.

标记法

使用java来实现的话,思路很多,我们着重讲一下标记法,其他方法后续补充:

常用算法篇-集合去重

标记法去重算法

如上图中,我们使用了java的HashMap类的特性,将学生姓名作为key,该学生姓名出现的次数作为value,遍历我们的List,如果标记map中没有出现过遍历的姓名,则添加到新List中并且为该key记录出现一次,如果标记map中出现过遍历的姓名,则不追加到新的list中,但记录该key出现次数加一次.

通过这样的标记算法,我们不仅可以得出不重复的姓名(以便我们为这些才艺表演的学生分发一份礼物),还可以看出小明既会唱歌又会跳舞还会敲代码(即小白会三种才艺表演,小明会两种才艺表演,而小花和小红会一种才艺表演).


set与list转换法

除了标记法,我们还可以使用Set与List之间的转换来去重,但这不是我推荐的方式,有局限性,不能跨语言实现去重,在这边只做简单介绍,如下图:

常用算法篇-集合去重

转换set去重

我们将list作为HashSet构造函数的参数,再将返回的已经不重复的Set作为ArrayList构造函数的参数,这样我们就得到了不重复的学生姓名List.


循环比较

常用算法篇-集合去重

循环比较法

这应该是我招聘面试过程中,最有可能回答的一种去重方法,但一直都没有碰到能够把思路说清晰透彻的同学


JDK API方法去重

api去重方法


总结:

  1. 标记法是小编最推荐的去重算法

  2. 平时多关心api中固有方法,并注重思维逻辑的培养

结尾ps:其他同学有更好的去重算法,请留言评论.谢谢



以上是关于常用算法篇-集合去重的主要内容,如果未能解决你的问题,请参考以下文章

常用算法篇-洗牌算法

大数据分析常用去重算法分析之Bitmap

Java常用算法

js中数组常用逻辑算法(从大到小,从小到大排序,去重等问题)

协同过滤算法总结篇

前端常用的一些算法