按值排序时 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.value
是 String
) compareTo
按字典顺序比较,而你想要数字。所以你必须重新实现它,获取子字符串(或找到最后一部分是数字,将其转换为 Integer
然后用户 compareTo
在 Integer
.
总的来说,我认为您的 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
来达到这个目的。
我相信您的值存储为字符串。如果不想改变value的数据类型,可以通过以下方式实现compareTo方法:
public int compareTo(Card p) {
return Integer.parseInt(this.value).compareTo(Integer.parseInt(p.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.value
是 String
) compareTo
按字典顺序比较,而你想要数字。所以你必须重新实现它,获取子字符串(或找到最后一部分是数字,将其转换为 Integer
然后用户 compareTo
在 Integer
.
总的来说,我认为您的 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
来达到这个目的。
我相信您的值存储为字符串。如果不想改变value的数据类型,可以通过以下方式实现compareTo方法:
public int compareTo(Card p) {
return Integer.parseInt(this.value).compareTo(Integer.parseInt(p.value));
}