比较器数据结构排序-如何在另一个字段上排序时保持插入顺序?

时间:2018-07-09 18:09:22

标签: java data-structures comparator

我有一个数据结构,该数据结构需要一个可选的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.CurrentTimeif (Object1.getPrice == Object2.getPrice && Object1.Timestamp > Object2.Timestamp) return 1时,这会打破等号情况-该方法不再识别出两个对象的价格相同,但仍会识别价格的高低。我该如何缓解?

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()。