arrays - 自定义 searchsortedfirst 方法

标签 arrays sorting vector julia

我是 Julia lang 的新手,所以我仍在努力阅读 Julia 文档。这是其中的一部分,我正在寻找特别是 bolded 部分的解释。

Base.Sort.searchsortedfirst — Function.

searchsortedfirst(a, x, [by=,] [lt=,] [rev=false])

Returns the index of the first value in a greater than or equal to x, according to the specified order. Returns length(a)+1 if x is greater than all values in a. a is assumed to be sorted.

Website

我的数组如下所示:

A = Vector{Record}()

在哪里

type Record
     y::Int64
     value::Float64
end

现在这是我的问题。我想在我的数组上调用上述方法并获得记录,其中给定 x 等于 y 在此记录(Record.y == x)。猜猜我必须写“by”转换或“lt”比较器?还是两者都有?

任何帮助都会得到帮助:)

最佳答案

@crstnbr 为一次性使用 searchsortedfirst 的情况提供了一个非常好的答案。 .我认为值得补充的是,还有一个更永久的解决方案。如果您输入 Record表现出自然排序,然后只需扩展 Base.islessBase.isequal到你的新类型。下面的示例代码展示了这对于您可能定义的一些新类型是如何工作的:

struct MyType ; x::Float64 ; end  #Define some type of my own
yvec = MyType.(sort!(randn(10)))  #Build a random vector of my type
yval = MyType(0.0)                #Build a value of my type
searchsortedfirst(yvec, yval)     #ERROR: this use of searchsortedfirst will throw a MethodError since julia doesn't know how to order MyType
Base.isless(y1::MyType, y2::MyType)::Bool = y1.x < y2.x   #Extend (aka overload) isless so it is defined for the new type
Base.isequal(y1::MyType, y2::MyType)::Bool = y1.x == y2.x #Ditto for isequal
searchsortedfirst(yvec, yval)     #Now this line works

一些值得注意的点:

1) 在我重载的步骤中islessisequal , 我在方法定义前加上 Base. .这是因为 islessisequal函数最初定义在 Base , 其中 Base指的是每次启动 julia 时自动加载的核心 julia 包。以 Base. 开头,我确保将我的新方法添加到这两个函数的当前方法集中,而不是替换它们。请注意,我也可以通过省略 Base. 来实现此目的。但事先包括一行 import Base: isless, isequal .就个人而言,我更喜欢我上面的方式(对于过于迂腐的人,你也可以两者都做)。

2) 我可以定义islessisequal但是我想要。这是我的类型和我的方法扩展。所以你可以为你的新类型选择任何你认为是自然顺序的东西。

3) 运算符< . <= , == , >= , > ,实际上都只需调用islessisequal在幕后,所有这些运算符现在都可以与您的新类型一起使用,例如 MyType(1.0) > MyType(2.0)返回 false .

4) 任何使用上述比较运算符的 julia 函数现在都可以与您的新类型一起使用,只要该函数是按参数定义的(Base 中的几乎所有内容都是如此)。 p>

关于arrays - 自定义 searchsortedfirst 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48078881/

相关文章:

c++ - Exception C++ 第 1 章第 1 部分中的 copy() 算法如何使用?

c - 为函数分配参数

python - 列表中最大的 n 个元素的项目和索引

c - 使用 -O2 减少冒泡排序 C 程序的时间

sql - 如何使用 SQL Order By 语句对结果进行不区分大小写的排序?

r - 使用 R 中的过滤函数计算 EMA

c++ - 将字符串存储到 vector 中

python - 通过两列连接两个数组并删除不需要的部分 PYTHON

ruby - 如何通过 Ruby 中的索引从数组中获取多个值

c++ - 在 C++ 中打印二维数组