2017-04-23 207 views
0

如果我有List的對象,其中每個對象對於getDistance(),getPrice(),getRating()等屬性都有不同的值。我應該怎麼做它?從具有多個屬性的列表對象中獲取最小/最大值

我試着重寫compareTo,但它只能排序一個屬性。

我想要做簡單的加法加權方法,我必須得到每個屬性的最小/最大值並執行計算。

謝謝!

回答

0

如果您有要使用特定算法進行排序的對象列表,則可以實現自己的比較器並使用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中的所有屬性,列表從最低到最高排序。

相關問題