按值排序时 compareTo 在 2 之前设置 10

compareTo sets 10 before 2 when sorting on value

让我举个例子来说明我正在努力实现的目标。只看数字,因为这是纸牌游戏。

我有:

harten5 klaveren4 klaveren7 schoppen5 ruiten5 schoppen2 klaverenheer schoppenheer schoppendame schoppen6 klaverenboer schoppen8 ruitenheer klaveren6...

我想将其排序为:

schoppen2 harten2 ruiten2 klaveren2 ruiten3 harten3 schoppen3 klaveren3 klaveren4 harten4 schoppen4 ruiten4 harten5 schoppen5 ruiten5...

但是我像这样在 2 之前得到 10:

schoppen10 ruiten10 harten10 klaveren10 schoppen2 harten2 ruiten2 klaveren2 ruiten3 harten3 schoppen3 klaveren3...

这是我的基本比较方法:

@Override
public int compareTo(Card p) {
    return this.value.compareTo(p.value);
}

我猜你想要相反的顺序?如果是这样,那么只需将您的实现更改为:

@Override
public int compareTo(Card p) {
    return p.value.compareTo(this.value);
}

这实际上取决于 "value" 的类型以及 "compareTo" 的实现方式。或者,如果 "value" 是整数,您可以这样做:

@Override
public int compareTo(Card p) {
    return this.value - p.value;
}

因为 String 的(我猜 this.valueStringcompareTo 按字典顺序比较,而你想要数字。所以你必须重新实现它,获取子字符串(或找到最后一部分是数字,将其转换为 Integer 然后用户 compareToInteger.

总的来说,我认为您的 class 卡片可以改进一点。特别是,我会重写它:

       class Card {
         private String value;
         private Integer rank;


        ...

         public int compareTo(Card c) {
          // Additional logic if you need to consider 
// also value (suite) in comparison
          return this.rank.compareTo(c.rank);
        }
       }

但是您也可以使用 enum 来达到这个目的。

String java API compareTo

我相信您的值存储为字符串。如果不想改变value的数据类型,可以通过以下方式实现compareTo方法:

    public int compareTo(Card p) {
        return Integer.parseInt(this.value).compareTo(Integer.parseInt(p.value));
    }