Java 使用两个元素对表进行排序

Java 使用两个元素对表进行排序,java,sorting,Java,Sorting,我想用Java进行排序。在我的对象中,我有很多元素,因此我想使用power和model进行排序: public class Product implements Comparable<Product>,Serializable { private int idProduct ; private int power; private String model; private String color; [...] @Override public int compar

我想用Java进行排序。在我的对象中,我有很多元素,因此我想使用power和model进行排序:

public class Product implements Comparable<Product>,Serializable
{   
private int idProduct ;
private int power;
private String model;
private String  color;
[...]
@Override
    public int compareTo(Product o) {
        return String.valueOf(this.power).compareTo(String.valueOf(o.power));

    }
公共类产品实现了可比较的、可序列化的
{   
私人产品;
私权;
私有字符串模型;
私有字符串颜色;
[...]
@凌驾
公共内部比较(产品o){
返回String.valueOf(this.power).compareTo(String.valueOf(o.power));
}

那么如何使用power和model进行排序呢?

以下内容将首先在
power
上进行排序,如果出现平局,将在
model
上进行排序:

public int compareTo(Product that) {
  if(this.power != that.power) {
    return this.power < that.power ? -1 : 1;
  } 
  else {
    return this.model.compareTo(that.model);
  }
}

您需要决定排序的第一件事是什么,第二件事是什么。一旦决定了这一点,您只需实现
compareTo
方法,如下所示:

@Override
public int compareTo(Product o) {
    int result = this.model.compareTo(o.model);
    if (result == 0)
        return String.valueOf(this.power).compareTo(String.valueOf(o.power));
    else
        return result;
}
或者,如果您不想将
compareTo更改为
方法,您可以这样编写自己的方法:

公共类ProductComparator实现Comparator{
公共整数比较(产品p1、产品p2){
int result=p1.model.compareTo(p2.model);
如果(结果==0)
返回String.valueOf(p1.power).compareTo(String.valueOf(p2.power));
其他的
返回结果;
}
}

CompareTo应在小于o时返回-1,在它们相等时返回0,在大于o时返回1

假设您的目标是使用model对具有相同能力的项目进行排序,因此您可以执行以下操作:

int powerDiff=String.valueOf(this.power).compareTo(String.valueOf(o.power));  
if(powerDiff==0)  
  return String.valueOf(this.model).compareTo(String.valueOf(o.model));  
return powerDiff;

还有几点:

1) 无需将电源转换为
字符串来进行比较。您可以执行基于整数的比较:

int result = this.power - o.power;
if (result == 0) {
  result = this.model.compareTo(o.model);
}
注意,这将产生与基于字符串的比较不同的排序顺序(例如,“200”>“10000”而“200<10000”)

2) 通过检查对象是否与自身进行比较,您可以进一步优化
compare to
方法:

public int compareTo(Product that) {
  int ret;

  if (this == that) { // Object is being compared against itself.
    ret = 0;
  } else {
    // Do full comparison.
  }

  return ret;
}
3) 从Comparator Javadoc:

使用时应小心 比较器一种能够施加压力的比较器 与等于不一致的排序 对已排序集(或已排序映射)进行排序


您的比较方法仅基于幂和模型,而平等将基于对象标识,除非您重写<代码>等值方法。因此,您可能需要考虑重写<代码>平等> <代码>(和<代码>哈希代码< /代码>)使它们与

比较一致

很好,除了
o
不是你知道的同一个词:PIt更快,但它给出了不同的排序顺序(例如2<11,但“2”>“11”)为什么要将幂转换为字符串以进行比较?您可以只写:result=this.power-o.power。@Adamski查看@Simon对我的答案的评论。compareTo合同规定,它应该根据结果返回负整数、0或正整数(例如,它不必返回-1,它可以返回-100)。
int result = this.power - o.power;
if (result == 0) {
  result = this.model.compareTo(o.model);
}
public int compareTo(Product that) {
  int ret;

  if (this == that) { // Object is being compared against itself.
    ret = 0;
  } else {
    // Do full comparison.
  }

  return ret;
}