我是 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.
我的数组如下所示:
A = Vector{Record}()
在哪里
type Record
y::Int64
value::Float64
end
现在这是我的问题。我想在我的数组上调用上述方法并获得记录,其中给定 x 等于 y 在此记录(Record.y == x)。猜猜我必须写“by”转换或“lt”比较器?还是两者都有?
任何帮助都会得到帮助:)
最佳答案
@crstnbr 为一次性使用 searchsortedfirst
的情况提供了一个非常好的答案。 .我认为值得补充的是,还有一个更永久的解决方案。如果您输入 Record
表现出自然排序,然后只需扩展 Base.isless
和 Base.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) 在我重载的步骤中isless
和 isequal
, 我在方法定义前加上 Base.
.这是因为 isless
和 isequal
函数最初定义在 Base
, 其中 Base
指的是每次启动 julia 时自动加载的核心 julia 包。以 Base.
开头,我确保将我的新方法添加到这两个函数的当前方法集中,而不是替换它们。请注意,我也可以通过省略 Base.
来实现此目的。但事先包括一行 import Base: isless, isequal
.就个人而言,我更喜欢我上面的方式(对于过于迂腐的人,你也可以两者都做)。
2) 我可以定义isless
和 isequal
但是我想要。这是我的类型和我的方法扩展。所以你可以为你的新类型选择任何你认为是自然顺序的东西。
3) 运算符<
. <=
, ==
, >=
, >
,实际上都只需调用isless
和 isequal
在幕后,所有这些运算符现在都可以与您的新类型一起使用,例如 MyType(1.0) > MyType(2.0)
返回 false
.
4) 任何使用上述比较运算符的 julia 函数现在都可以与您的新类型一起使用,只要该函数是按参数定义的(Base
中的几乎所有内容都是如此)。 p>
关于arrays - 自定义 searchsortedfirst 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48078881/