对java中的整数对列表进行排序
我想对整数对数组列表进行排序。到目前为止,我已经能够根据第一个元素对它们进行排序,但是我得到了类似(1,2),(1,-2)的结果。我还想根据第二个元素对它们进行排序,这样我就可以得到一个正确排序的arraylist,但我似乎无法让它正常工作 第一个元素排序的代码为:对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) {
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
会因为溢出而变得更糟。