一个人问了一个关于如何使用替代的相等函数在python中获取列表唯一函数的问题.
我认为可以通过继承元素类并重载相等函数来完成
import functools
@functools.total_ordering
class ffloat(float):
def __eq__(self,other):
if floor(self) == floor(other):
return True
else:
return False
def __le__(self,other):
if self == other:
return True
else:
return float(self) <= float(other)
def __hash__(self):
return floor(self)
a = map(ffloat,[4.3,8,8.9, 13])
In [41]: a[1] == a[2]
Out[41]: True
Run Code Online (Sandbox Code Playgroud)
但
In [42]: set(a)
Out[42]: set([4.3, 8.0, 8.9, 13.0])
Run Code Online (Sandbox Code Playgroud)
编辑:用平面相等替换abs <1.5相等
添加Hash PS有一种方法可以使一个类和两个lambda创建一个类工厂,并返回一个继承第一个类的类,覆盖所需的相等函数.
我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成.假设没有任何自定义对象覆盖该hashCode()方法,如果我比较对象中每个字段的哈希码,并且它们结果是相同的,那么我是否100%确信比较对象的内容是相同?如果没有,假设我不能使用任何外部库,那么您建议使用哪种方法来比较两个对象.
我已经定义了一个struct Coords,它显式地实现了三个接口,每个接口定义如下:
public partial struct Coords
{
int ICoordsUser.X { get { return VectorUser.X; } }
int ICoordsUser.Y { get { return VectorUser.Y; } }
IntVector2D ICoordsUser.Vector { get { return VectorUser; }
set { VectorUser=value; } }
ICoordsCanon ICoordsUser.Canon { get { return this; } }
ICoordsUser ICoordsUser.Clone() { return NewUserCoords(VectorUser); }
string ICoordsUser.ToString() { return VectorUser.ToString(); }
IEnumerable<NeighbourCoords> ICoordsUser.GetNeighbours(Hexside hexsides) {
return GetNeighbours(hexsides);
}
int ICoordsUser.Range(ICoordsUser coords) { return Range(coords.Canon); }
}
Run Code Online (Sandbox Code Playgroud)
与名字ICoordsCanon,ICoordsUser和 …
我有两个哈希集,我用不同的方式构造,包含所有枚举值.
setWithAllEnums.Equals(setToTest); // Returns false
!(setWithAllEnums.Except(setToTest).Any()); // Returns True
为什么这些不相同?.NET没有为枚举提供GetHashCode吗?
我在scala解释器中得到了这个:
scala> val a:Float = 71F; val b:Int = 71; if (a==b) println ("?")
?
a: Float = 71.0
b: Int = 71
Run Code Online (Sandbox Code Playgroud)
我想知道这种比较的确切语义是什么.即使我对Scala有一个肤浅的知识,我猜浮点数运算(在这种情况下,我确保不使用与java的BigDecimal相当的东西,或者至少我认为)适用于这个例子.所以"a"不是持有数字71,因为"b"是,但接近它.
我认为任何整数到浮点比较产生错误会简化事情,但我相信我必须遗漏一些东西.
另外,我想知道这是否会导致代码中的任何错误.
之前我已经编写了HashMap来存储一些对象,这些对象期望在存储它们时使用身份.即如果Object.equals()这样说,对象被视为"相同" .
后来我用内容评估范例对这些对象的类进行编码hashCode()和编写equals()方法.我的上一次立即HashMap停止工作,因为对象正在变异并变得不平等.
如何插入一些简单的解决方法,使早期的代码工作?可能有一种方法强制HashMap使用身份,尽管有定义equals()和hashCode()方法的事实?
我有以下代码片段:
main( )
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出
0 50 0
Run Code Online (Sandbox Code Playgroud)
我不知道我理解的第一个值怎么printf来0.当值k与之比较时35,理想情况下它应该返回(并因此打印)1,但它如何打印为零?产生的其他两个值 - 50并且0都是正确的,因为在第二个值中,k的值被视为50,而对于第三个值,k的值(即35)被比较40.因为35 < 40,所以它打印0.
任何帮助将不胜感激,谢谢.
**更新**
在研究了关于这个主题的更多内容之后undefined behavior,我在一本关于C的书中看到了这一点,最后给出了源代码.
调用约定 调用约定表示在遇到函数调用时参数被传递给函数的顺序.这里有两种可能性:
C语言遵循第二顺序.
考虑以下函数调用:
fun (a, b, c, d ) ;
Run Code Online (Sandbox Code Playgroud)
在这个调用中,参数是从左向右还是从右向左传递并不重要.但是,在某些函数调用中,传递参数的顺序成为一个重要的考虑因素.例如:
int a = 1 ;
printf …Run Code Online (Sandbox Code Playgroud) 我不明白为什么
(setq a_sym 'abc)
(print (eq a_sym 'abc))
(print (eq 'x 'x))
(print (eq (first '('x 2 3)) 'x))
Run Code Online (Sandbox Code Playgroud)
版画
T
T
NIL
Run Code Online (Sandbox Code Playgroud)
为什么'x第三个语句中的符号与第二个语句的处理方式不同?并且,脚踏实地,如何比较它们的身份?
所有资源显示如何覆盖Equals(object)和GetHashCode()使用数字字段来实现该GetHashCode()方法:
实现Equals方法
Equals和GetHashCode的最佳策略是什么?
为什么在重写Equals方法时重写GetHashCode很重要?
但是,在我的课上,我没有任何数字字段.它是树中的节点,引用其父节点,子节点和接口作为数据:
public class Node
{
private IInterface myInterface;
private Node parent;
private List<Node> children = new List<Node>();
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var node = (Node)obj;
return myInterface == node.myInterface;
}
public override int GetHashCode()
{
???
}
}
Run Code Online (Sandbox Code Playgroud)
我应该用什么设置哈希码?
如何检查引用是否指向C++中的特定对象?
我的意思是这样的:
int x(0);
int& xR = x;
if(xR == x)
{
//xR is refering to x
}
else
{
//xR is not refering to x
}
Run Code Online (Sandbox Code Playgroud)