当前位置: 首页 > 知识库问答 >
问题:

Java中类的等价关系和自然排序

白学
2023-03-14

我已经很好地理解了Comparable和Comparator接口之间的区别,以及它们强加的顺序。

此外,我很清楚为什么compareTo必须与equals方法一致。从Oracle文档,

强烈建议(尽管不是必需的)自然顺序与相等一致。这是因为没有显式比较器的排序集(和排序映射)在与自然顺序与等号不一致的元素(或键)一起使用时表现“奇怪”。特别是,这种排序集合(或排序映射)违反了集合(或映射)的一般契约,该契约是根据等方法定义的。

例如,如果添加两个键ab,则(!a.equals(b)

然而,我无法澄清以下段落,

对于具有数学倾向的类,定义给定类C上自然顺序的关系为:

    {(x, y) such that x.compareTo(y) <= 0}.

这个总顺序的商是:

    {(x, y) such that x.compareTo(y) == 0}.

compareTo的契约中,商是C上的等价关系,自然顺序是C上的总顺序。当我们说一个类的自然排序与等于一致时,我们的意思是自然排序的商是由类的equals(Object)方法定义的等价关系:

    {(x, y) such that x.equals(y)}.  

作者在这里试图提出什么建议?。有人能用一个简单的例子来解释吗。


共有3个答案

赏开宇
2023-03-14

都是数学!(x, y)指"x与y有关"

等价关系是反映、对称和过渡的元素集合(在本例中为C类实例)上的关系。

反射方式:每个元素与自身相关对称方式:如果a与b相关,则b与过渡方式相关:如果a与b相关,且b与c相关,则a与c相关。

因此,x.compareTo(y)==0的商关系对于c:c的每个实例c是等价关系。compareTo(c)假设为零,对于c:if c1的每个实例c1,c2。比较(c2)==0,然后是c2。compareTo(c1)也应为零。对于所有c1,c2,c3,其中c1。比较(c2)是零和c2。比较器(c3)为零,然后为c1。compareTo(c3)也应为零。

总的顺序是一种关系,它是传递的(见上文)、反对称的(同样见上文,但现在它是反对称的)和总的,因此compareTo应该反映总的顺序:如果A.compareTo(b)是

总数是指a.compare至(b)

商来自a.compareTo(b)

我希望这是一个比原来更解释。。。

刘令
2023-03-14

假设你创建了这个愚蠢的类

public class A implements Comparable<A> {
  private int value;

  public A(int value){
    this.value = value }

  public boolean equals(Object obj){ 
     if (obj instanceof A)
        return this.value = ((A)obj).value;
     else return false;
  }

  public int compareTo(A another){
     return 0;
  }
}

然后创建两个实例:

A a1 = new A(3);
A a2 = new A(4);
SortedSet<A> set = new TreeSet<A>();
set.add(a1);
set.add(a2);

SortedSet接受a1,但不接受a2,因为a1。等于(a2)=假,但等于a2。比较(a2)==0;记住,在定义集合中,所有元素都是彼此不同的(就像集合的数学概念)。

东门清夷
2023-03-14

基本上,它是说与equals一致意味着(xy)对的集合x.compareTo(y)==0true,与xytrue的(x)对的集合相同。

这与第一段中使用的与等于一致的常识性理解没有什么不同。它只是用形式代数的方式来表达定义。我肯定有人认为把它添加到文档中会很有趣,但是我不确定它对程序员有什么实际的用处。

 类似资料:
  • 问题内容: 我与hibernate和甲骨文一起工作 我使用此代码: 我想用postgreSQL做同样的事情 但是PostgreSQL不支持’FROM dual’语法 我想知道PostgreSQL 中 Dual的 等效性 问题答案: 您根本不需要子句。只是会做。

  • 这个问题已经发布了等价的api测试依赖在Gradle?但我看不出有什么解决办法。 我们声明的依赖项很少,如下所示 我们想把这些暴露给这个库的消费者。由于是testImplementation,消费者需要显式地声明这些依赖关系,而这些依赖关系是我们想要避免的。

  • 问题内容: 有没有一种优雅的方法可以在MySQL数据库中进行高性能的自然排序? 例如,如果我有此数据集: 最终幻想 最终幻想4 最终幻想10 最终幻想12 最终幻想12:爱情之链 最终幻想冒险 最终幻想起源 最终幻想战术 除了将游戏名称拆分成各个组成部分外,其他任何 优雅的 解决方案 标题 :《最终幻想》 编号 :“ 12” 副标题 :“ Promathia的链条” 确保它们以正确的顺序出现?(1

  • 我正在使用FindBug,我想了解由它生成的.xml报告用于文档目的。 我找不到任何资料提到他们之间的关系。 我参考了FindBugs Bug描述和FindBugs2站点,这个问题没有一个明确的答案 我们似乎有几个类别, null null

  • 我无法设置任何内容:或其他内容,包括和。是否可以从主机访问名称和?似乎无法设置中的变量...请帮我确定我遗漏了什么,提前谢谢

  • GCP的云存储API上有一种方法,允许调用方检索对象元数据。记录于https://cloud.google.com/storage/docs/json_api/v1/objects/get 是否有与此方法等效的?我尝试过但是它返回的信息比调用API方法更多。 我的问题的背景是,我正在实现一个自定义角色,以对GCS存储桶/对象应用权限。为了测试该自定义角色,我正在编写一个脚本,该脚本执行该自定义角色