【问题标题】:Sort a list of pairs of integers java对整数对列表进行排序java
【发布时间】:2012-04-09 19:35:43
【问题描述】:

我想对整数对的数组列表进行排序。到目前为止,我已经能够根据第一个元素对它们进行排序,但是我得到了类似 (1,2)、(1,-2) 的东西。我还想根据第二个元素对它们进行排序,以便获得正确的排序数组列表,但我似乎无法使其工作。

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

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 是一对中的第一个和第二个元素。

但我认为它会覆盖第一个元素的排序顺序,还是我弄错了? 谁能帮我解决这个问题。

【问题讨论】:

    标签: java integer compare comparator


    【解决方案1】:

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

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      很简单,这样实现:

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

      【讨论】:

      • 我在第二个元素 compareTo 方法中实现这个?
      • 不,在您的compare 方法中只需调用compareFirstElms,如果它表明第一个元素不同则返回该调用的结果,如果它们相同则调用compareSecondElms并返回结果。
      【解决方案3】:

      您不会使用两个不同的比较器,而是使用一个(这可能反过来调用其他比较器来完成内部工作)。

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

      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;
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        第三,我会选择明确、简洁但完整的名称。不要随意缩写单词的一部分,这并不能完全提高可读性。 compareByFirstcompareBySecond 分别如何?

        【讨论】:

        • "比较两个整数就像编写 this.p1 - p.p1 一样简单" ...前提是所有值都保持在安全范围内。 Integer.MAX_VALUE - Integer.MIN_VALUE == -1.
        • Integer.MIN_VALUE - X 会因为溢出而更糟。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        相关资源
        最近更新 更多