猿问

Java中任意集的笛卡尔积

Java中任意集的笛卡尔积

您知道一些简洁的Java libary允许您生成两个(或更多)集合的笛卡儿积吗?

例如:我有三套。一个是类人物的对象,第二个是礼物类的对象,第三个是吉夫特扩展类的对象。

我想要生成一套包含所有可能的三元组的人-礼物-吉夫特扩展。

集合的数量可能会有所不同,所以我不能在嵌套的foreach循环中这样做。在某些情况下,我的应用程序需要制作一个人-礼物对的产品,有时是三人-礼物-吉夫特扩展,有时甚至可能有设置Person-Gift-GiftExtension-GiftSecondExtension-GiftThirdExtension,等。


米琪卡哇伊
浏览 1348回答 3
3回答

繁华开满天机

删除了两个集合的先前解决方案。有关详细信息,请参阅编辑历史记录。这里有一种方法可以递归地对任意数量的集合执行此操作:public&nbsp;static&nbsp;Set<Set<Object>>&nbsp;cartesianProduct(Set<?>...&nbsp;sets)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(sets.length&nbsp;<&nbsp;2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Can't&nbsp;have&nbsp;a&nbsp;product&nbsp;of&nbsp;fewer&nbsp;than&nbsp;two&nbsp;sets&nbsp;(got&nbsp;"&nbsp;+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sets.length&nbsp;+&nbsp;")"); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;_cartesianProduct(0,&nbsp;sets);}private&nbsp;static&nbsp;Set<Set<Object>>&nbsp;_cartesianProduct(int&nbsp;index,&nbsp;Set<?>...&nbsp;sets)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Set<Set<Object>>&nbsp;ret&nbsp;=&nbsp;new&nbsp;HashSet<Set<Object>>(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(index&nbsp;==&nbsp;sets.length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(new&nbsp;HashSet<Object>()); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Object&nbsp;obj&nbsp;:&nbsp;sets[index])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Set<Object>&nbsp;set&nbsp;:&nbsp;_cartesianProduct(index+1,&nbsp;sets))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.add(obj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(set); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;}请注意,不可能在返回的集合中保留任何泛型类型信息。如果事先知道您想要的产品有多少集,则可以定义一个泛型元组来保存这些元素(例如Triple<A, B, C>),但是在Java中不可能有任意数量的泛型参数。

PIPIONE

集合的数量可能会有所不同,所以我不能在嵌套的foreach循环中这样做。两个提示:AxBxC=Ax(BxC)递归
随时随地看视频慕课网APP

相关分类

Java
我要回答