【问题标题】:how to find all possible combinations between tuples without duplicates scala如何在没有重复的情况下找到元组之间的所有可能组合
【发布时间】:2018-11-18 11:07:39
【问题描述】:

假设我有元组列表:

val a = ListBuffer((1, 5), (6, 7))

更新: 假定 a 中的元素在每个 tuples2 中都是不同的,换句话说,它可以是 (1,4) (1,5),但不是 (1,1) (2,2)

我想在这两个元组之间生成ListBuffer a 的所有组合的结果,但不重复。结果将如下所示:

ListBuffer[(1,5,6), (1,5,7), (6,7,1), (6,7,5)]

更新: 结果 tuple3 中的元素也是不同的。它们自身的元组也是不同的,意味着只要 (6,7,1) 存在,那么 (1,7,6) 就不应该出现在结果元组 3 中。

如果,例如val a = ListBuffer((1, 4), (1, 5)),那么结果输出应该是ListBuffer[(1,4,5)],其中(1,4,1) and (1,5,1)被丢弃

如何在 Scala 中做到这一点?

注意:我只是举了一个例子。通常val a 有几十个scala.Tuple2

【问题讨论】:

  • (1, 6, 7) 怎么样?是否正好有两个输入元组(为什么它们在一个列表中)?
  • 对不起。它已经在那里了。与 (6,7,1) 相同
  • 输入元组中的元素都是不同的吗?
  • 是的。 val a = ListBuffer((1, 5), (6, 7)) 中的元组和单个元素是不同的。 tuples3 和它们各自的元素也是不同的。
  • 这需要为两个以上的元组或更长的元组工作吗?如果没有,您可以只写出四种组合(它们将是不同的,因为所有输入元素都是不同的)。 case Seq((a,b),(c,d)) => Seq((a,b,c),(a,b,d),(c,d,a),(c,d,b))

标签: scala scala-collections


【解决方案1】:

如果单个元素是唯一的,正如您评论的那样,那么您应该能够展平所有内容(非元组),获得所需的 combinations(),然后重新元组。

更新

val a = collection.mutable.ListBuffer((1, 4), (1, 5))
a.flatMap(t => Seq(t._1, t._2))     //un-tuple
  .distinct                         //no duplicates
  .combinations(3)                  //unique sets of 3
  .map{case Seq(x,y,z) => (x,y,z)}  //re-tuple
  .toList                           //if you don't want an iterator

【讨论】:

  • 这也将使组合从三个输入元组中各取一个元素(不仅仅是两个来自一个,一个来自另一个)。这可能是本意。它还可以重新排序从单个元组中获取的两个元素(这样 (1,2)+(3,4) 可以变为 (2,1,3) 而不是 (1,2,3))。不确定这是否是有意的。 @Khaled 需要澄清组件顺序是否重要以及为什么这些首先是元组(而不仅仅是列表或集合)。
  • 它们在元组内部是唯一的,但在外部不是。我的意思是它可以是 (1,4) (1,5) 但不是 (1,1) (1,5)。
  • 在本例中,您希望结果包含(1,4,1)?
  • 不,它应该被忽略。元组内的元素应该是唯一的,因此(1,4,1) 被删除或丢弃。
  • 我更新了这个问题。抱歉,如果一开始不清楚。所以假设输入是(1,4) (1,5),那么输出应该是(1,4,5),丢弃(1,4,1) and (1,5,1)
猜你喜欢
  • 2013-03-03
  • 2019-10-28
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多