首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中一类类的等价关系与自然排序

Java中一类类的等价关系与自然排序
EN

Stack Overflow用户
提问于 2014-10-22 20:03:16
回答 3查看 1.3K关注 0票数 1

我非常清楚地理解了可比接口和比较器接口之间的区别,以及它们所强加的顺序。

此外,我很清楚为什么compareTo必须与等于方法一致。来自Oracle文档

强烈建议(虽然不是必需的)自然秩序与平等一致。这是因为没有显式比较器的排序集(和排序映射)在与自然排序与等于不一致的元素(或键)一起使用时表现“奇怪”。特别是,这样一个排序集(或排序映射)违反了set (或map)的一般契约,后者是根据equals方法定义的。 例如,如果将两个键ab添加到不使用显式比较器的排序集中,则第二个add操作返回false (排序集的大小不会增加),因为从排序集的角度来看,a和b是等价的。

但是,我无法澄清(以下)段,

对于数学上的倾向,定义给定的C类上的自然顺序的关系是: {(x,y)使得x.compareTo(y) <= 0}。 这个总订单的商数是: {(x,y)使得x.compareTo(y) == 0}。 根据compareTo的契约,商是C上的一个等价关系,自然序是C上的一个全序,当我们说一个类的自然序与等价类一致时,我们意味着自然序的商是由类的equals(Object)方法定义的等价关系: {(x,y)使x.equals(y)}

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

EN

回答 3

Stack Overflow用户

发布于 2014-10-22 20:11:52

从根本上说,与等于一致意味着(xy)对的集合( x.compareTo(y) == 0true )和(xy)对的集合( x.equals(y)true )是相同的。

这与第一段中使用的一致的常识理解没有什么不同。它被简单地用一种形式代数的方式表达定义。我肯定有人认为把它添加到文档中会很有趣,但我不确定它对程序员有什么实用价值。

票数 4
EN

Stack Overflow用户

发布于 2014-10-22 20:20:05

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

代码语言:javascript
复制
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;
  }
}

然后创建两个实例:

代码语言:javascript
复制
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,因为a=(A2) == false,但是a 2. a2.compareTo(a2) == 0;请记住,在定义集合中,所有元素彼此是不同的(这就像数学上的集合集合)。

票数 0
EN

Stack Overflow用户

发布于 2014-10-22 20:21:52

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

等价关系是一个元素集合上的关系(在这种情况下是C类的实例),它是反射的、对称的和过渡性的。

反射装置:每一个元素都是对称的:如果a涉及b,那么b涉及过渡手段:如果a涉及b,b涉及c,则a涉及c。

因此,x.compareTo(y) == 0的商关系是一个等价关系,对于C: c.compareTo(c)的每个实例c假定为零,对于C中的每个实例c1,如果C:c1.比较到( c2 )==0,则c2.比较(C1)也应该是零.对于所有的c1,c2,c3,其中c1比较到(C2)是零,c2比较(C3)是零,那么c1比较到(C3)也应该是零。

全序是一种传递关系(见上文)、反对称关系(再一次看到上面,但现在是反的),因此,compareTo应该反映一个全序:如果a.compareTo(b)是<= 0,b.compareTo(c) <= 0,那么如果a.compareTo(b)是<= 0,则a.compareTo(c)必须是<= 0,那么b.compareTo(a)必须是>= 0。

总计是指a.compareTo(b) <= 0或b.compareTo(a) <= 0,总计是指任何元素都可以与另一个元素进行比较,因此所有元素都可以排序,因此排序是总计的。

商数来自a.compareTo(b) <=0和b.compareTo(a) <= 0,因此a.compareTo(b) == 0

我希望这比原来的更能解释.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26516099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档