多个集合中的共同和独特元素

本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题。 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很不错。

因此,让我们开始吧。 有时,您会发现需要确定一个集合中的哪些元素存在于另一个集合中,哪些是常见的和/或哪些不存在于另一个集合中。 阿帕奇百科全书集合在CollectionUtils一些一些实用方法是有用的,尤其是路口 (),但这个帖子去有点超出了到计算集合的集合独特的元素,它总是很高兴坐下来的细节。 我们还将通过支持任意数量的集合(而不是像CollectionUtils那样仅支持两个集合)来使解决方案更加通用。 另外,事实是,并非所有人都选择或能够包含库只是为了获得几个有用的实用程序方法。

当仅处理两个集合时,这不是一个难题,但是并非所有开发人员都熟悉java.util.Collection定义的所有方法,因此这里是一些示例代码。 他们的关键是一起使用keepAllremoveAll方法来构建三个集合-通用,仅在集合A中存在,仅在B中存在。

Set<String> a = new HashSet<String>();
a.add("a");
a.add("a2");
a.add("common");Set<String> b = new HashSet<String>();
b.add("b");
b.add("b2");
b.add("common");Set<String> inAOnly = new HashSet<String>(a);
inAOnly.removeAll(b);
System.out.println("A Only: " + inAOnly );Set<String> inBOnly = new HashSet<String>(b);
inBOnly .removeAll(a);
System.out.println("B Only: " + inBOnly );Set<String> common = new HashSet<String>(a);
common.retainAll(b);
System.out.println("Common: " + common);

输出:

A Only: [a, a2]
B Only: [b, b2]
Common: [common1]

处理三个或更多集合
处理两个以上的集合时,这个问题有些棘手,但是可以很简单地以一种通用的方式解决,如下所示:

计算通用元素
计算公共元素很容易,即使有大量集合,此代码也将始终如一地执行。

public static void main(String[] args) {List<String> a = Arrays.asList("a", "b", "c");List<String> b = Arrays.asList("a", "b", "c", "d");List<String> c = Arrays.asList("d", "e", "f", "g");List<List<String>> lists = new ArrayList<List<String>>();lists.add(a);System.out.println("Common in A: " + getCommonElements(lists));lists.add(b);System.out.println("Common in A & B: " + getCommonElements(lists));lists.add(c);System.out.println("Common in A & B & C: " + getCommonElements(lists));lists.remove(a);System.out.println("Common in B & C: " + getCommonElements(lists));
}public static <T> Set<T> getCommonElements(Collection<? extends Collection<T>> collections) {Set<T> common = new LinkedHashSet<T>();if (!collections.isEmpty()) {Iterator<? extends Collection<T>> iterator = collections.iterator();common.addAll(iterator.next());while (iterator.hasNext()) {common.retainAll(iterator.next());}}return common;
}

输出:

Common in A: [a, b, c]
Common in A & B: [a, b, c]
Common in A & B & C: []
Common in B & C: [d]

计算独特元素
计算唯一元素与计算通用元素一样简单。 请注意,此代码的性能将随着您添加大量集合而降低,尽管在大多数实际情况下都没有关系。 我猜想有一些方法可以优化它,但是由于我没有遇到问题,所以我没有打扰tryin。 正如克努斯(Knuth)著名的说法 :“我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源”。

public static void main(String[] args) {List<String> a = Arrays.asList("a", "b", "c");List<String> b = Arrays.asList("a", "b", "c", "d");List<String> c = Arrays.asList("d", "e", "f", "g");List<List<String>> lists = new ArrayList<List<String>>();lists.add(a);System.out.println("Unique in A: " + getUniqueElements(lists));lists.add(b);System.out.println("Unique in A & B: " + getUniqueElements(lists));lists.add(c);System.out.println("Unique in A & B & C: " + getUniqueElements(lists));lists.remove(a);System.out.println("Unique in B & C: " + getUniqueElements(lists));
}public static <T> List<Set<T>> getUniqueElements(Collection<? extends Collection<T>> collections) {List<Set<T>> allUniqueSets = new ArrayList<Set<T>>();for (Collection<T> collection : collections) {Set<T> unique = new LinkedHashSet<T>(collection);allUniqueSets.add(unique);for (Collection<T> otherCollection : collections) {if (collection != otherCollection) {unique.removeAll(otherCollection);}}}return allUniqueSets;
}

输出:

Unique in A: [[a, b, c]]
Unique in A & B: [[], [d]]
Unique in A & B & C: [[], [], [e, f, g]]
Unique in B & C: [[a, b, c], [e, f, g]]

这里的所有都是它的。 随意使用此代码,无论您喜欢什么,如果有任何改进或建议,请发表评论。 当我们分享知识和经验时,开发人员都将从中受益。

参考: 计算多个集合中的公共和唯一元素– Java和我们的JCG合作伙伴   Carfey软件博客博客上的Craig Flichel。


翻译自: https://www.javacodegeeks.com/2012/03/common-and-unique-elements-in-multiple.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2016给自己一个交代

一、前言 在关于技术上的学习&#xff0c;常常有这样那样的计划&#xff0c;而最终一个都没有真正的落实。零散的学习&#xff0c;终究需要系统总结&#xff0c;才能使自己有所沉淀。从毕业至今&#xff0c;我一直在忙碌&#xff0c;为公司付出自己的很多很多&#xff0c;却只不…

洛克人红色思考型机器人叫什么_稻船敬二新企划《红色灰烬》 依然是机器人风格...

稻船敬二离开CAPCOM之后玩家们纷纷感叹《洛克人》系列将再无续作&#xff0c;不过在单飞的这段时间里&#xff0c;稻船敬二还是创作了诸如《苍蓝雷霆 刚巴尔特》《Mighty No.9》等类似洛克人风格的作品。其名下的团队comcept的最新作《Mighty No.9》即将于9月18日发售&#xff…

常见对话框

(1)普通对话框 // 点击按钮 弹出一个普通对话框public void click1(View v) {// 构建AlertDialogAlertDialog.Builder builder new Builder(this);builder.setTitle("警告");builder.setMessage("世界上最遥远的距离是没有网络");builder.setPositiveButt…

JavaScript学习随记——面向对象编程(继承)

Example:基于原型链的继承 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>面向对象编程&#xff08;OOP&#xff09;</title></head> <body>…

NSCharacterSet

先上个例子&#xff1a; NSString * str1 [nameInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; NSString * str2 [passwdInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; […

Apache Mahout:构建垃圾邮件过滤器服务器

Lucene发生了一些相当有趣的事情。 它最初是作为一个库&#xff0c;然后其开发人员开始基于它添加新项目。 他们开发了另一个开源项目&#xff0c;该项目将向Lucene添加爬网功能&#xff08;以及其他功能&#xff09;。 Nutch实际上是任何人都可以使用或修改的功能齐全的Web Se…

建模步骤_古建设计 | sketchup建模步骤教程(简易入门版)

前言本篇教程主要是针对古建建模入门者。小N给大家分享一套我相对简易的建模步骤。(PS&#xff1a;但是估计有些人可能会感觉我做的东西已经繁琐了……)因为主要是为了让大家熟悉、入门和好记忆。所以讲的东西&#xff0c;小N我会相对简单&#xff0c;有些细节的内容不会更多展…

JavaScript模块化

JavaScript模块化的实现方式&#xff1a; <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>模块化</title></head> <body><script type&quo…

Linux下面的IO模型

1. Linux下的五种I/O模型 阻塞I/O模型&#xff1a; 一直阻塞 应用程序调用一个IO函数&#xff0c;导致应用程序阻塞&#xff0c;等待数据准备好。 如果数据没有准备好&#xff0c;一直等待….数据准备好了&#xff0c;从内核拷贝到用户空间,IO函数返回成功指示。 我们 第一…

改变导航栏上边的状态栏颜色

#pragma mark - 改变状态栏颜色 -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }转载于:https://www.cnblogs.com/block123/p/5195203.html

PIT和TestNG突变测试简介

变异测试是一种技术&#xff0c;它可以发现测试未涵盖代码的哪些部分。 它类似于代码覆盖范围 &#xff0c;但变异测试不限于在测试期间执行给定行的事实。 这个想法是修改生产代码&#xff08;引入突变&#xff09;&#xff0c;这应该改变其行为&#xff08;产生不同的结果&am…

JavaScript内存管理——优化内存占用

使用具备垃圾收集机制的语言编写程序&#xff0c;开发人员一般不必操心内存管理的问题。但是&#xff0c;JavaScript在进行内存管理及垃圾收集时面临的问题还是有点与众不同。其中最主要的一个问题&#xff0c;就是分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序的少…

Java 8的烹调方式– Lambda项目

什么是project lambda &#xff1a;Project lambda是用于以Java语言语法启用lambda表达式的项目。 Lambda表达式是功能编程语言&#xff08;如lisp&#xff09;中的主要语法。 Groovy将是支持lambda表达式&#xff08;也称为闭包&#xff09;的java的最接近亲戚。 那么什么是la…

ffmpeg文档38-视频源

38 视频源 下面是当前有效的视频源 buffer 缓冲视频帧&#xff0c;其可以作为滤镜链图的环节 它通常用于编程&#xff0c;特别是通过libavfilter/vsrc_buffer.h的接口。 接受如下参数&#xff1a; video_size 指定视频尺寸&#xff0c;(同时指定width 和 height)。语法同于ffmp…

系统架构的演变 -----自 罗文浩

转自&#xff1a;https://my.oschina.net/lwhmdj0823/blog/617713版权声明&#xff1a;罗文浩所有摘要: 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#x…

前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)

前言&#xff1a;作为一名前端开发程序猿&#xff0c;每天都被产品经理催着开发&#xff0c;项目一启动&#xff0c;产品就过来了。嘘寒问暖&#xff1a;大胸弟&#xff0c;你啥时开始做啊&#xff1f;一般我们都会直接告诉TA&#xff0c;你先找接口解决数据问题。而我们也会经…

cron表达式详解

Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;Cron有如下两种语法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month …

将Ehcache添加到Openxava应用程序

介绍 本文介绍如何在Openxava应用程序上快速启用Ehcache&#xff0c;从而提高性能。 查看实体及其图时&#xff0c;将加载关系。 添加第二级缓存可加快关联元素的检索速度&#xff0c;因为已加载的元素是从缓存而不是数据库中检索的。 最终&#xff0c;该页面解释了分钟项目如…

java mongodb 返回所有field_JAVA高级之反射

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;今天跟大家分享JAVA高级之反射的知识。一、什么是反射反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所以属性和方法&#xff1b;对于…

Linux入门笔记——cal、date、free、clear、history、man、whatis、uname

1、cal 显示日历2、date 显示系统当前的日期和时间3、df查看磁盘剩余空间的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容4、free显示空闲内存的数量&#xff0c;常用参数 -h &#xff08;human&#xff09;人性化显示内容5、clear清除控制终端显示…