Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对java中的整数对列表进行排序_Java_Integer_Compare_Comparator - Fatal编程技术网

对java中的整数对列表进行排序

对java中的整数对列表进行排序,java,integer,compare,comparator,Java,Integer,Compare,Comparator,我想对整数对数组列表进行排序。到目前为止,我已经能够根据第一个元素对它们进行排序,但是我得到了类似(1,2),(1,-2)的结果。我还想根据第二个元素对它们进行排序,这样我就可以得到一个正确排序的arraylist,但我似乎无法让它正常工作 第一个元素排序的代码为: private class FirstElmComparator implements Comparator<Pair> { public int compare(Pair pr1, Pair pr2) {

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

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

private class FirstElmComparator implements Comparator<Pair> {

    public int compare(Pair pr1, Pair pr2) {
        return pr1.compareFirstElms(pr2);
    }
}
我可以将第二个元素比较器设想为:

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));
}
私有类SecondElmComparator实现Comparator{
公共整数比较(对pr1,对pr2){
返回pr1。比较一致性(pr2);
}
}
受保护的内部比较冷凝器(p对){
返回(新整数(this.p2)).compareTo(新整数(p.p2));
}
注:p1和p2是成对的第一个和第二个元件

但我认为它会覆盖第一个元素排序顺序,还是我弄错了?
有人能帮我吗。

这很简单,实现起来如下:

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;
}
  • 如果要比较的对的第一个元素不同,则按第一个元素排序
  • 否则(如果第一个元素相等),对第二个元素进行排序

它非常简单,实现方式如下:

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;
}
  • 如果要比较的对的第一个元素不同,则按第一个元素排序
  • 否则(如果第一个元素相等),对第二个元素进行排序

您可以创建一个通用比较器,用于计算对中的两个元素

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

您可以创建一个通用比较器来计算对中的两个元素

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

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

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

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


第三,我会选择明确、简洁但完整的名称。不要随意缩写部分单词,这对可读性没有帮助。分别是
compareByFirst
compareBySecond
怎么样?

首先,您需要为此编写一个明确的方法:

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

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


第三,我会选择明确、简洁但完整的名称。不要随意缩写部分单词,这对可读性没有帮助。分别使用
compareByFirst
compareBySecond
怎么样?

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

因此,在伪代码中,比较如下所示:

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

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

因此,在伪代码中,比较如下所示:

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

我在第二个元素compareTo方法中实现了这一点?不,在
compare
方法中,只需调用
compareFirstElms
,如果它指示第一个元素不同,则返回该调用的结果,如果它们相同,则调用
compareSecondElms
并返回结果。我在第二个元素compareTo方法中实现了这一点?不,在
compare
方法中,只需调用
compareFirstems
,如果它指示第一个元素不同,则返回该调用的结果,如果它们是相同的,那么调用
compareseconnelms
并返回结果。“比较两个int就像编写这个.p1-p.p1一样简单”。。。前提是,所有值都保持在安全范围内
Integer.MAX\u VALUE-Integer.MIN\u VALUE==-1
Integer.MIN\u VALUE-X
会因为溢出而变得更糟。“比较两个整数就像写这个.p1-p.p1一样简单”。。。前提是,所有值都保持在安全范围内
Integer.MAX_值-Integer.MIN_值==-1
Integer.MIN_值-X
会因为溢出而变得更糟。