首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何简化2计数数组上的{a }数学?

如何简化2计数数组上的{a }数学?
EN

Stack Overflow用户
提问于 2021-02-01 08:49:25
回答 1查看 89关注 0票数 1

我想做一些应该很简单的事情。我有一个数组流,其中包含两个边。对于每个数组,我只想从第一个数组的第二个边减去一个值。在某些语言中,这仅仅是array[0].value - array[1].value。但是,我只完成了以下工作:

代码语言:javascript
运行
复制
local(
    project('a', 'b').
      by(unfold().limit(1)).
      by(unfold().tail(1)).
    math('a - b').
      by('bias'))

但是,如果没有project()limit()tail(),这似乎要简单得多。这也让我怀疑,如果数组中有3项或更多项,我将如何从数组中获得正确的项。例如:如果第二项不再是tail(),我将如何获得它?我猜limit(2).tail(1)?只是看起来非常混乱。如果我简单地使用一个fold()步骤,我可以非常接近于简化这个操作:

代码语言:javascript
运行
复制
local(
    unfold().
    values('bias').
    fold(0, minus))

以这种方式使用fold()是非常干净的,但是会导致0 - a - b的出现。如果我能用一个动态的值来代替那个种子,那么我就能取得更多的成就。但即便如此,我也必须做一些类似(2 * a) - a - b的事情,才能达到正确的结果。将0种子替换为动态变量(如limit(1).values('bias') )的尝试失败,因为它是错误的类型。但无论如何我也不会满足于这种武断的代码。然后,我的最后想法是对项目进行索引,然后按索引选择:

代码语言:javascript
运行
复制
local(
    index().
      with(WithOptions.indexer, WithOptions.map))

虽然边被索引得很好,但我找不到一种方法来使它有用。我想我可以用select('0')来获取第一个项目,但是什么也没有返回。

我想我的问题是:是否有一种简单的方法来实现a - b,就像用sum()fold(0, sum)实现a + b一样?如果没有,是否有一种更干净的方法来选择数列中的项目?还是在数学之前,所有的东西都应该放在project()里呢?看起来太麻烦了..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-01 18:38:42

您可以很容易地跳过project()

代码语言:javascript
运行
复制
gremlin> arr = [[g.E(7).next(),g.E(8).next()],[g.E(8).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4]]
==>[e[8][1-knows->4],e[10][4-created->5]]
gremlin> g.inject(arr).unfold().as('a','b').
......1>   math('a - b').
......2>     by(limit(local,1).values('weight')).
......3>     by(tail(local,1).values('weight'))
==>-0.5
==>0.0

您仍然必须使用unfold().limit()/tail(),但我认为这是一种更好的方法,因为它避免创建一个Map,只为了扔掉它。

还让我怀疑,如果数组中有3个或更多项,如何从数组中获得正确的项。例如:如果第二项不再是tail(),我将如何获得它?我猜极限(2).tail(1)?

您可以使用range()来避免多步骤方法:

代码语言:javascript
运行
复制
gremlin> arr = [[g.E(7).next(),g.E(8).next(),g.E(9).next()],[g.E(8).next(),g.E(10).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4],e[9][1-created->3]]
==>[e[8][1-knows->4],e[10][4-created->5],e[10][4-created->5]]
gremlin> g.inject(arr).unfold().as('a','b').
......1>   math('a - b').
......2>     by(limit(local,1).values('weight')).
......3>     by(range(local,1,2).values('weight'))
==>-0.5
==>0.0

您可以使用sack()来避免math(),但我不确定它简化了对内部列表的分离(即仍然坚持limit()/tail()):

代码语言:javascript
运行
复制
gremlin> arr = [[g.E(7).next(),g.E(8).next()],[g.E(8).next(),g.E(10).next()]]
==>[e[7][1-knows->2],e[8][1-knows->4]]
==>[e[8][1-knows->4],e[10][4-created->5]]
gremlin> g.withSack(0).inject(arr).unfold().
......1>   sack(assign).by(limit(local,1).values('weight')).
......2>   sack(minus).by(tail(local,1).values('weight')).
......3>   sack()
==>-0.5
==>0.0

顺便问个好问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65989602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档