我有一个数据结构,该数据结构需要一个可选的class Human():
def __init__(self, name, gender):
self.name = name
self.gender = gender
def speak_name(self):
print "My name is %s" % self.name
def speak(self, text):
print text
def perform_math_task(self, math_operation, *args):
print "%s is champion in mathmatic operation %f" %(self.name, math_operation(*args))
def add (a, b):
return a+b
will = Human("XYZ", "Female")
print will.name
print will.gender
will.speak_name
will.speak("I love Python Programming.")
will.perform_math_task(add, 34, 67)
来自定义排序(在这种情况下,它是一个Comparator
,但实际上没关系,我可以换成{{1} },而不会破坏我的代码)。目前,它是根据结构要存储的对象上的字段TreeSet
进行排序的。
当2个对象的价格相同时,我希望PriorityQueue
成为决胜局,时间戳为price
。要在比较器中指定此内容,我必须使用:
timestamp
问题是当我执行System.CurrentTime
或if (Object1.getPrice == Object2.getPrice && Object1.Timestamp > Object2.Timestamp) return 1
时,这会打破等号情况-该方法不再识别出两个对象的价格相同,但仍会识别价格的高低。我该如何缓解?
答案 0 :(得分:0)
使用Comparator
,您可以决定集合的顺序(实际上还有它们的“唯一性”!)。
因此,您必须确定对象是否相等:
为此不同的用途使用不同的数据结构可能是一个选择,或者可能涵盖这两者。取决于其他要求和代码边界。
在这里看看:https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html
基于TreeMap的NavigableSet实现。元素使用其自然排序或在设置创建时提供的Comparator 进行排序,具体取决于所使用的构造函数。
因此,您提供了比较器。
请注意,由集合(无论是否提供显式比较器)维护的顺序如果要正确实现Set接口,必须与equals保持一致。 (有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以这样,是因为Set接口是根据equals操作定义的,但是 TreeSet实例使用其compareTo(或compare)方法执行所有元素比较。 ,因此从该集合的角度来看,此方法认为相等的两个元素相等。
因此,如果集合中已经有一个equals
对象(咨询比较器),则需要再次添加,因为它会根据顺序放在集合中的同一位置(如果您不喜欢这样做,请不要使用Set)。它们应实现一致(即使不是编译器强行强制执行的)。因此,它没有使用直接的equals
,而是使用了比较器。
在内部,比较器可以使用对象的equals
运算符(在if(obj1.equals(obj2)){return 0;}
这样的if语句内部)。
但是如何实现equals
-在内部,它将取决于一些属性比较(就像您现在在比较器中所做的那样)。
如果您不喜欢数据结构,则不要使用(Tree)Set。
根据需要,可以使用Map或List。
选择合适的收藏:
http://www.javapractices.com/topic/TopicAction.do?Id=65
对于==
和equals
之间的区别:
==
正在比较引用,可以说指向容器的指针,如果为true,则它是同一实例。 equals
在比较对象,可以说对象容器的内容,如果为true,则它在属性中具有相同的值但是,可能有数以百万计的枯竭文章。
注意: equals
的对象应与hashCode()方法一致地实现。对于(树)集,比较器的实现应与equals
一致(也许使用类似if(obj1.equals(obj2)){return 0;}
的东西)。此外,其他Set
实现也为此使用hasCode()。