前言:在各类网站论坛上,没有找到与工作比较贴切的技能,所以特此写一些对刚步入工作或者工作中没有重视的技能与问题,各位大牛请及时关闭文章.
ps:文中所有标点都是英文的,看官请不要在意.为了便于平时敲代码,所以中文输入法也默认了英文标点(防止各类因为标点引起的低级错误).纯属个人原创见解,若不正确,请各位批评指正.
集合去重
在工作中我们时常需要用到将一个集合中的元素去重的算法,例如如下的场景
我们的需求是 : 月底要开迎新晚会,现在我们已经统计了分别会唱歌的,会跳舞的,会敲代码的学生,然后我们需要把这些会任意才艺表演的学生罗列出来,每人分发小一份礼品
下面我们直接上代码例子来说明:
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去重方法
总结:
标记法是小编最推荐的去重算法平时多关心api中固有方法,并注重思维逻辑的培养
结尾ps:其他同学有更好的去重算法,请留言评论.谢谢。
转载自:https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&context=%7B%22sourceFrom%22%3A%22bjh%22%2C%22nid%22%3A%22news_3104905643666744194%22%7D