如何使用Comparable Interface比较ArrayList中对象的多个属性? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Comparable Interface比较ArrayList中对象的多个属性? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我需要通过相应的属性对我的ArrayList Rectangle
中的list1
对象进行排序:height
,width
和topCorner
(Point)。我可以在评估一个属性时对列表进行排序。
我如何设置我的compareTo
方法,以便它首先尝试通过height
,然后通过width
(如果所有对象高度相等)对列表中的对象进行排序,最后通过topCorner
(如果所有对象高度和宽度相等)?
public class Point implements Comparable<Point> {
private int x;
private int y;
public Point(){
this(0,0);
}
public Point(int x,int y){
this.x=x;
this.y=y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public int compareTo(Point pt){
if(x==pt.x){
return y-pt.y;
}
else{
return x-pt.x;
}
}
public String toString(){
return "("+x+", "+y+")";
}
}
class Rectangle implements Comparable<Rectangle> {
private int height;
private int width;
private Point topCorner;
public Rectangle(int x,int y,int height,int width){
this.height=height;
this.width=width;
this.topCorner=new Point(x,y);
}
public int getHeight(){
return height;
}
public int getWidth(){
return width;
}
public Point getPoint(){
return topCorner;
}
public int compareTo(Rectangle rect){
if(height!=rect.height){
int compareHeight=((Rectangle)rect).getHeight();
return this.height-compareHeight;
}
else if(width!=rect.width){
int compareWidth=((Rectangle)rect).getWidth();
return this.width-compareWidth;
}
else if(topCorner!=rect.topCorner){
Point comparePoint=((Rectangle)rect).getPoint();
return this.topCorner-topCorner;
}
else{
System.out.println("// ERROR BRO // ERROR BRO //");
}
return 0;
}
public String toString(){
return "(H:"+height+", W:"+width+", P:"+topCorner+")";
}
}
===========================================================================
public class RectangleComparable {
public static void main(String[]args){
Random rn=new Random(21);
ArrayList<Rectangle> list1=new ArrayList<>();
for(int index=0;index<10;index++){
int ran1=rn.nextInt(21), ran2=rn.nextInt(21),
ran3=rn.nextInt(21), ran4=rn.nextInt(21);
list1.add((new Rectangle(5,ran2,ran3,ran4)));
}
System.out.println("KEY : H=height, W=width, P=point\n");
System.out.println("Unsorted List : \n"+list1+"\n");
Collections.sort(list1);
System.out.println("Sorted List : \n"+list1);
}
}
如果这是一个重复的问题,我会继续道歉并道歉。我环顾四周,但是我找不到任何给我一个直接答案的东西(因为我还是一个编程菜鸟)。
答案
您可以编写自己的Comparator
或构建如下:
Comparator
.comparingInt(Rectangle::getHeight)
.thenComparingInt(Rectangle::getWidth)
.thenComparing(Rectangle::getTopCorner);
以上是关于如何使用Comparable Interface比较ArrayList中对象的多个属性? [重复]的主要内容,如果未能解决你的问题,请参考以下文章
java学习笔记13--比较器(ComparableComparator)
public interface Command //接口里定Proocess方法用于封装“处理行为” void Process(int [] target);