标签: comparison-operators

在Ruby中按多个条件排序

我有一组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_categorysort!.最红宝石的方法是什么?

ruby sorting operators comparison-operators spacecraft-operator

8
推荐指数
1
解决办法
5561
查看次数

Array# - (减法运算符)如何比较元素是否相等?

当我调用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

8
推荐指数
1
解决办法
1763
查看次数

C++中的运算符调用语法

是否存在语法的情况

if (first == second) // ...
Run Code Online (Sandbox Code Playgroud)

有什么不同?

if (first.operator==(second)) // ...
Run Code Online (Sandbox Code Playgroud)

我不这么认为,但只是想知道它.

c++ operators comparison-operators

8
推荐指数
2
解决办法
160
查看次数

为什么在"YYYY-MM-DD"的日期格式中,两个字符串的PHP中的比较小于或者多于比较,即使它们是字符串?

我正在为一个项目的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)

php date string-comparison comparison-operators

8
推荐指数
1
解决办法
3205
查看次数

避免代码重复定义比较运算符`<,<=,>,> =,==,!=`,但考虑到NaNs的最佳方法?

我数学,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

8
推荐指数
1
解决办法
134
查看次数

我可以将pandas.dataframe.isin()与数字容差参数一起使用吗?

我事先审查了以下帖子.有没有办法使用具有近似因子或容差值的DataFrame.isin()?还是有其他方法可以吗?

如果列中的值位于设置的值列表中,则过滤数据帧行

使用值列表从pandas数据帧中选择行

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

8
推荐指数
1
解决办法
2237
查看次数

如何重载operator ==()指向类的指针?

我有一个叫做的课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)

如果我省略那个星号,编译器会不高兴.

有没有一种方法,让比较操作比较*AStringconst char*

c++ pointers operator-overloading comparison-operators

7
推荐指数
2
解决办法
1万
查看次数

sql使用"小于或等于"和"不大于"

为什么有两个不同的逻辑运算符似乎做同样的事情(<=&!>),是否有任何情况会优先于另一个?

sql comparison-operators

7
推荐指数
1
解决办法
3万
查看次数

为什么9007199254740993!= 9007199254740993.0?

这种比较的结果让我感到惊讶(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)

这里发生了什么?

python floating-point numbers comparison-operators

7
推荐指数
1
解决办法
390
查看次数

C++20 显式默认相等运算符

我试图了解 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 方法造成问题,因为当遇到 …

c++ default operator-overloading comparison-operators c++20

7
推荐指数
1
解决办法
202
查看次数