排序整数对的列表java

时间:2012-03-26 09:35:47

标签: java integer compare comparator

我想对一对整数的arraylist进行排序。到目前为止,我已经能够根据第一个元素对它们进行排序,但我得到类似(1,2),(1,-2)的东西。我想根据第二个元素对它们进行排序,这样我就可以得到一个正确的排序arraylist,但我似乎无法使它工作。

第一个元素排序的代码是:

private class FirstElmComparator implements Comparator<Pair> {

    public int compare(Pair pr1, Pair pr2) {
        return pr1.compareFirstElms(pr2);
    }
}

和compareFirstElms函数如下:

protected int compareFirstElms (Pair p) {
    return (new Integer (this.p1)).compareTo(new Integer (p.p1));
}

我可以考虑将第二个元素比较器作为以下内容:

private class SecondElmComparator implements Comparator<Pair> {

    public int compare(Pair pr1, Pair pr2) {
        return pr1.compareSecondElms(pr2);
    }
}

protected int compareSecondElms (Pair p) {
    return (new Integer (this.p2)).compareTo(new Integer (p.p2));
}

注意:p1和p2是一对中的第一个和第二个元素。

但我认为它会覆盖第一个元素排序顺序,还是我错了? 任何人都可以帮助我。

4 个答案:

答案 0 :(得分:4)

您可以创建一个通用比较器来评估对的两个元素。

public int compare(Pair pr1, Pair pr2) {
    int firstResult = pr1.compareFirstElms(pr2);
    if (firstResult == 0) { //First comparison returned that both elements are equal
        return pr1.compareSecondElms(pr2);
    } else {
        return firstResult;
    }
}

答案 1 :(得分:3)

这很简单,就像这样实现:

  • 如果要比较的对的第一个元素不同,则对第一个元素进行排序。
  • 否则(如果第一个元素相等),则对第二个元素进行排序。

答案 2 :(得分:2)

你不会使用两个不同的比较器而只使用一个(这可能反过来召唤其他人进行内部工作)。

所以在伪代码中,比较看起来像这样:

public int compare(Pair pr1, Pair pr2) {

  int result = compare(p1.first, p2.first);

  if( result == 0 ) {
    result = compare(p1.second, p2.second);
  }

  return result;
}

答案 3 :(得分:1)

嗯,首先,您需要为此编写一个显式方法:

public int compare(Pair p) {
    int first = compareFirstElms(p);
    return first == 0 ? compareSecondElms(p) : first;
}

其次,不要过度工程。比较两个整数就像写this.p1 - p.p1一样简单。无需转换。

第三,我会选择明确,简洁但完整的名称。不要随意缩写词的部分,这并不完全有助于提高可读性。分别是compareByFirstcompareBySecond怎么样?