当前位置: 首页 > 知识库问答 >
问题:

Scala - flattened Carthesian产品中嵌套列表的组合

牧璞
2023-03-14

我有一个有趣的问题,对于Scala新手来说很难。< br >我需要合并两个列表:< br >

listA : List[List[Int]]
listB : List[Int]

以下面的方式:

val listA = List(List(1,1), List(2,2))
val listB = List(3,4)
val listC = ???

// listC: List[List[Int]] = List(List(1,1,3),List(1,1,4),List(2,2,3),List(2,2,4)

在Java中,我将使用两个嵌套循环:

for(List<Integer> list : listA) {
    for(Integer i: listB) {
        subList = new ArrayList<Integer>(list);
        subList.add(i);
        listC.add(subList);
    }
}

我猜这是Scala中的一行代码,但是到目前为止我还不知道。

共有2个答案

鲜于光赫
2023-03-14

scand1sk的答案几乎可以肯定是你应该在这里使用的方法,但作为旁注,还有另一种思考这个问题的方式。您所做的实际上是将追加操作提升到列表的应用函子中。这意味着使用Scalaz,您可以编写以下内容:

import scalaz._, Scalaz._

val listC = (listA |@| listB)(_ :+ _)

我们可以将< code>(_ : _)视为一个函数,它接受一个事物列表和一个相同类型的单一事物,并返回一个新列表:

(_ :+ _): ((List[Thing], Thing) => List[Thing])

Scalaz为列表提供了一个适用的函子实例,所以我们实际上可以创建一个新函数,为上面的每种类型添加一个额外的列表层。奇怪的< code>(x |@| y)(_ : _)语法说:创建这样一个函数,并将其应用于< code>x和< code>y。结果就是你想要的。

在理解的情况下,如果您不关心顺序,您可以通过使用< code>::并颠倒参数的顺序来提高操作效率。

有关更多信息,请参阅我在这里关于Haskell中的笛卡尔积的类似答案,对Scala中应用函子的介绍,或者这篇关于在Scala中使这种事情的语法不那么丑陋的博客文章。当然,如果您不在乎,请随时忽略上述所有内容。

傅茂实
2023-03-14

您想执行扁平化的笛卡尔乘积。对于理解是最简单的方法,可能看起来类似于您的Java解决方案:

val listC = for (list <- listA; i <- listB) yield list :+ i
 类似资料:
  • 我为我的项目工作分层类别和产品表。 类别表结构: 身份证-父母-所有权 1-0-计算机 1-0-电话 ... 分类表行25107的计数。 产品表结构 ID-CAT-TITLE 1-1-产品名称在这里 我想要列表产品的当前类别和子类别。 输出为:641981835518356956239050461189005561179059050690507612090509050905059051090511

  • 问题内容: 试图了解如何在Firebase中实现嵌套列表。 可以解决的问题:1-to-N消息传递系统,对于每个消息,您希望维护一个已接收和阅读该消息的用户列表。 阅读了“ Firebase中阵列的最佳实践”。尝试避免使用数组,因为我要同时进行写操作,而在这里看来它们并不是一个好选择。 当前试图通过在每个消息下存储子树来实现此目的,每个子树是已接收,读取或以其他方式对消息 Y 执行某些操作 X 的用

  • 3.4 产品列表 3.4.1 描述 通过调用该接口为指定订单号的订单明细 3.4.2 请求地址 地址:https://api.bokecs.com/recharge/productList?pageSize=10&pageNum=3 3.4.3 请求方式 GET 3.4.4 请求参数 1) 请求入参 元素名称 是否必须 元素描述 pageNum 否 默认为1 pageSize 否 默认10 2)

  • 从另一个角度看这3行: 编辑:注意表有2000列,是否可以动态创建一个类(或向类添加属性),例如在Scala中从外部文件加载字段名和类型?我知道case类仅限于22个字段 Edit2:还要注意,任何属性都可以有多行(rowkey除外),即orderid、name、amount、supplier、account和1995+其他列,所以为所有这些属性创建单独的“singleline”类是不可行的,我正

  • 作为数独生成器的一部分,我有一个用于过滤嵌套列表的函数,以便只返回某些索引的内部列表以及这些列表中某些索引的内部列表元素。其思想是返回一个List[Int],其中包含一个3x3正方形的值,该正方形取自一个9x9数独拼图,表示为List[List[Int]],作为函数的参数提供。 我尝试了两种方法,但都未能始终如一地发挥作用。一种方法尝试从列表中筛选出某些子列表,然后从其余列表中筛选出项目。此函数完

  • 我是Java8新手,需要重写一段旧代码来实现一个新的alghoritm。任务是过滤每个列表具有最大速度的对象。列表嵌套在地图中:道路的根地图,其中包含道路段的地图,每个道路段的地图包含对象列表,每个对象以时间间隔降低测量的速度。我需要找到每个列表的所有最大速度。 我发现以下链接看起来像我的问题,但我不能适应他们,我不确定我的尝试解决我的问题正确。 如何使用Java8流和过滤器过滤嵌套循环? Jav