我有一组Post对象,我希望能够根据这些条件对它们进行排序:
一些帖子将有日期(新闻和事件),其他帖子将有明确的职位(实验室和投资组合).
我希望能够打电话posts.sort!,所以我已经覆盖了<=>,但我正在寻找最有效的排序方式.以下是伪方法:
def <=>(other)
# first, everything is sorted into
# smaller chunks by category
self.category <=> other.category
# then, per category, by date or position
if self.date and other.date
self.date <=> other.date
else
self.position <=> other.position
end
end
Run Code Online (Sandbox Code Playgroud)
看起来我必须实际排序两次,而不是将所有内容都塞进那个方法中.那样的sort_by_category话sort!.最红宝石的方法是什么?
ruby sorting operators comparison-operators spacecraft-operator
当我调用Array#-它似乎没有调用我正在比较的字符串上的任何比较方法:
class String
def <=>(v)
puts "#{self} <=> #{v}"
super(v)
end
def ==(v)
puts "#{self} == #{v}"
super(v)
end
def =~(v)
puts "#{self} =~ #{v}"
super(v)
end
def ===(v)
puts "#{self} == #{v}"
super(v)
end
def eql?(v)
puts "#{self}.eql? #{v}"
super(v)
end
def equal?(v)
puts "#{self}.equal? #{v}"
super(v)
end
def hash()
puts "#{self}.hash"
super
end
end
p %w{one two three} - %w{two}
Run Code Online (Sandbox Code Playgroud)
它只是返回:
["one", "three"]
Run Code Online (Sandbox Code Playgroud)
那么,Array#-做什么?
另外,我使用的是Ruby 1.9.2p290.在1.8.7中它似乎导致无限循环.
ruby arrays operator-overloading subtraction comparison-operators
是否存在语法的情况
if (first == second) // ...
Run Code Online (Sandbox Code Playgroud)
有什么不同?
if (first.operator==(second)) // ...
Run Code Online (Sandbox Code Playgroud)
我不这么认为,但只是想知道它.
我正在为一个项目的PHP代码部分工作,该项目将YYYY-MM-DD格式的日期与当前日期进行比较,以查看它是否小于当前日期.在代码的不同点,使用两种不同的方法进行这种比较.第一个用于get_timestamp()日期并运行时间戳的比较.在另一个地方,它只是将日期的字符串与输出进行比较date("Y-m-d").我的期望是两个日期字符串的比较不会提供正确的答案.但是,当我设置几个测试用例时,我得到了预期的输出.我回顾了PHP手册的两个部分以获得洞察力,但我仍然感到困惑的是,为什么比较无需转换为时间戳.
PHP手册的比较运算符部分指出,字符串要么被转换为数字,要么进行数字比较,或者它产生称为词法比较的东西.我在词法比较中找不到任何进一步的东西,但是当我读到关于字符串转换为数字并尝试使用日期字符串的示例时,我尝试了每个日期字符串的相同数字输出.
有人可以帮助我理解为什么两个日期字符串的比较大于或小于两个日期字符串(或者至少看起来有效)?我错过了什么?
作为后续工作,如果确实有效,我假设将日期转换为时间戳并根据时间戳进行比较是一种更好的做法.哪个是用于将日期转换为时间戳的更好功能:get_timestamp()或strtotime()?
示例代码小于/大于两个YYYY-MM-DD字符串的比较:
if ("2013-06-27" < "2013-06-28") { echo "less"; } // Output: less
if ("2013-06-27" > "2013-06-28") { echo "more"; } // Output: (none)
if ("2013-06-29" < "2013-06-28") { echo "less"; } // Output: (none)
if ("2013-06-29" > "2013-06-28") { echo "more"; } // Output: more
Run Code Online (Sandbox Code Playgroud)
示例代码测试转换后的YYYY-MM-DD字符串的数值
$foo = 1 + "2013-06-27";
echo "\$foo==$foo"; // Output: $foo = 2014
$foo = 1 + "2013-06-28";
echo …Run Code Online (Sandbox Code Playgroud) 我数学,x <= y相当于!(x > y).在大多数情况下,这适用于浮点运算,但并非总是如此.当x或者y是NaN,x <= y是不是等同于!(x > y),因为比较一个NaN任何事情总是返回false.但是,x <= y <=> !(x > y)大部分时间都是如此.
现在,假设我正在编写一个包含浮点值的类,我想为这个类定义比较运算符.为了明确,假设我正在编写一个高精度浮点数,它在double内部使用一个或多个值来存储高精度数.在数学上,x < y这个类的定义已经定义了所有其他运算符(如果我与比较运算符的通常语义一致).但是,NaNs打破了这个数学上的精确性 所以也许我不得不分别编写许多这些运算符,只是为了考虑NaNs.但有更好的方法吗?我的问题是:如何尽可能避免代码重复并仍然尊重行为NaN?
相关:http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm.boost /运营商如何解决此问题?
注意:我标记了这个问题,c++因为这是我理解的.请用该语言编写示例.
c++ floating-point operator-overloading comparison-operators
我事先审查了以下帖子.有没有办法使用具有近似因子或容差值的DataFrame.isin()?还是有其他方法可以吗?
EX)
df = DataFrame({'A' : [5,6,3.3,4], 'B' : [1,2,3.2, 5]})
In : df
Out:
A B
0 5 1
1 6 2
2 3.3 3.2
3 4 5
df[df['A'].isin([3, 6], tol=.5)]
In : df
Out:
A B
1 6 2
2 3.3 3.2
Run Code Online (Sandbox Code Playgroud) python comparison floating-accuracy comparison-operators pandas
我有一个叫做的课AString.这是非常基本的:
class AString
{
public:
AString(const char *pSetString = NULL);
~AString();
bool operator==(const AString &pSetString);
...
protected:
char *pData;
int iDataSize;
}
Run Code Online (Sandbox Code Playgroud)
现在我想写这样的代码:
AString *myString = new AString("foo");
if (myString == "bar") {
/* and so on... */
}
Run Code Online (Sandbox Code Playgroud)
但是,现有的比较运算符仅支持
if (*myString == "bar")
Run Code Online (Sandbox Code Playgroud)
如果我省略那个星号,编译器会不高兴.
有没有一种方法,让比较操作比较*AString有const char*?
为什么有两个不同的逻辑运算符似乎做同样的事情(<=&!>),是否有任何情况会优先于另一个?
这种比较的结果让我感到惊讶(CPython 3.4):
>>> 9007199254740993 == 9007199254740993.0
False
Run Code Online (Sandbox Code Playgroud)
我对文档的理解是左操作数应该被转换float为匹配右操作数的类型:
Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有"较窄"类型的操作数被扩展为另一个的操作数,其中整数比浮点更窄,这比复数更窄.混合类型数量之间的比较使用相同的规则.构造函数int(),float()和complex()可用于生成特定类型的数字.
这似乎没有发生:
>>> float(9007199254740993) == 9007199254740993.0
True
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我试图了解 C++20 中引入的新默认比较运算符。我的问题是关于何时隐式定义显式默认的比较运算符。下面的代码示例说明了这个问题:
#include <iostream>
struct B
{
operator bool() const { return true; }
};
struct D : B
{
bool operator==(const D&) const = default;
};
bool operator==(B, B) { return false; }
int main ()
{ D d;
std::cout << (d == d);
}
/* Outputs:
0 in gcc 10.1
1 in msvc 19.26
*/
Run Code Online (Sandbox Code Playgroud)
该程序的输出依赖于编译器。似乎 MSVC 在遇到默认声明时为类 D 定义了 operator==,因此它不使用稍后为类 B 定义的 operator==。相比之下,gcc 等待 D 的隐式定义operator== 直到实际需要它,此时为 B 定义的 operator== 在范围内,并被使用。哪种行为(如果有)是正确的?
一个相关的问题是,为什么不能为具有引用成员的类声明默认的 operator== ?我可以看到引用成员可能会对 MSVC 方法造成问题,因为当遇到 …