从具有多个属性的列表对象中获取最小/最大值
问题描述:
如果我有List的对象,其中每个对象对于getDistance(),getPrice(),getRating()等属性都有不同的值。我应该怎么做它?从具有多个属性的列表对象中获取最小/最大值
我试着重写compareTo,但它只能排序一个属性。
我想要做简单的加法加权方法,我必须得到每个属性的最小/最大值并执行计算。
谢谢!
答
如果您有要使用特定算法进行排序的对象列表,则可以实现自己的比较器并使用Collection.sort()方法对列表进行排序。假设你有一个叫做的容器类这是你想要比较的对象,它有3个属性;距离,价格和评级。您将实现您的Container类型的自定义比较器,并定义检查2个Container对象的特定算法。我在下面写了一个例子,其中比较添加了所有3个属性的值,并将它们除以3(在这个例子中,除以3是不必要的,但我将它保留在那里以表明您可以使方程更如果需要复杂),它会比较哪一个较低并返回一个指示该事实的整数。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Container {
private double distance;
private double price;
private double rating;
public Container(double distance, double price, double rating) {
this.distance = distance;
this.price = price;
this.rating = rating;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getRating() {
return rating;
}
public void setRating(double rating) {
this.rating = rating;
}
}
class CustomComparator implements Comparator<Container> {
@Override
public int compare(Container o1, Container o2) {
double avgVal1 = (o1.getDistance()+o1.getPrice()+o1.getRating())/3;
double avgVal2 = (o2.getDistance()+o2.getPrice()+o2.getRating())/3;
return avgVal1 < avgVal2 ? -1 : 1;
}
}
public class CompareTest {
public static void main(String[] args) {
List<Container> containerList = new ArrayList<Container>(4);
containerList.add(new Container(2.0, 3.0, 6.0));
containerList.add(new Container(1.0, 1.0, 1.0));
containerList.add(new Container(6.2, 0.0, 0.0));
containerList.add(new Container(0.0, 3.2, 1.5));
Collections.sort(containerList, new CustomComparator());
for(int idx=0; idx<containerList.size(); idx++){
System.out.println("Distance:" + containerList.get(idx).getDistance() +
"\tPrice:" + containerList.get(idx).getPrice() +
"\tRating:" + containerList.get(idx).getRating());
}
}
}
在运行的main(),它会创建容器对象在没有特定的顺序列表,然后对其进行排序使用自定义比较,然后打印出来,这是输出:
Distance:1.0 Price:1.0 Rating:1.0
Distance:0.0 Price:3.2 Rating:1.5
Distance:6.2 Price:0.0 Rating:0.0
Distance:2.0 Price:3.0 Rating:6.0
您可以在此处看到,根据Container中的所有属性,列表从最低到最高排序。