【问题标题】:Getting the min / max value from a list object that has multiple attributes从具有多个属性的列表对象中获取最小值/最大值
【发布时间】:2017-09-20 09:21:04
【问题描述】:

如果我有 List 的对象,其中每个对象的属性值不同,例如 getDistance()、getPrice()、getRating() 等。我应该怎么做?

我尝试过覆盖 compareTo 但它只能对一个属性进行排序。

我正在尝试使用简单的加法加权方法,我必须获取每个属性的最小值/最大值并使用它进行计算。

谢谢!

【问题讨论】:

    标签: java android list sorting


    【解决方案1】:

    如果您有一个要使用特定算法排序的对象列表,那么您可以实现自己的 Comparator 并使用 Collection.sort() 方法对列表进行排序。假设您有一个名为 Container 的类,它是您要比较的对象,它有 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() 之后,它会创建一个不按特定顺序排列的 Container 对象列表,然后使用自定义比较器对它们进行排序,然后打印出来,这是输出:

    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 中的所有属性从低到高排序。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多