1

Car オブジェクトのリストがあります。各自動車オブジェクトには、セダン、suv、クーペ、バン、トラックのいずれであるかを示すタイプと、その他の属性があります。私のアプリケーションがこれらを以下にリストされている順序でランク付けすると仮定します

  • セダン(最低)
  • クーペ
  • バン
  • SUV
  • トラック(最高)

リストの中から最高ランクのタイプを見つけるにはどうすればよいですか。

class Car {

 public Car (String type, String model, int year, long mileage){
     this.type=type;
     this.model = model;
     this.year = year;
     this.mileage = mileage;
 }

  private String type; // Sedan, SUV etc
  private String model; // Focus, Corolla, Camry, Taurus etc
  private int year; 
  private long mileage;

 //getters

}

List<Car> allCars = new ArrayList();
allCars.add(new Car("Coupe", "Focus", 1999, 50000) );
allCars.add(new Car("Sedan", "Camry", 2007, 60000) );
allCars.add(new Car("Truck", "Sierra", 2007, 50000) );
allCars.add(new Car("Truck", "F-150", 2001, 60000) );
allCars.add(new Car("Van", "Sienna", 1999, 40000) );

Java 5 でトラック (最高ランクのタイプの車) を見つける最も効率的な方法は何ですか? 必要に応じて、apache commons api または guava を使用できます。

ループスルーして、一意の型のセットを作成できます。

 Set<String> uniqueTypes = new HashSet<String>;
 for(Car car: allCars) {
     uniqueTypes.add(car.getType);
 }

上記のセットを使用して、最大値 (この例ではトラック) を調べるにはどうすればよいですか。Collections.max() は自然順序で最大値を返しますか?

4

2 に答える 2

2

まず、車のタイプを an にすることが役立ちますenum。これにより、値のソートがより簡単になり、Carクラスに型の安全性が追加されます。

次のステップは、 のmax(Collection<? extends T> coll, Comparator<? super T> comp)メソッドを使用することですCollections

同じタイプの車が 2 台ある場合、他の値でソートする方法を決定する必要があります。デフォルトの実装は、遭遇した最初の最大値を返します。タイプが同じ場合、たとえばモデルで二次ソートを実行することができます。

次に例を示します。

public static void main(String[] args) throws ParseException {
    List<Car> allCars = new ArrayList();
    allCars.add(new Car(CarType.COUPE, "Focus", 1999, 50000));
    allCars.add(new Car(CarType.SEDAN, "Camry", 2007, 60000));
    allCars.add(new Car(CarType.TRUCK, "Sierra", 2007, 50000));
    allCars.add(new Car(CarType.TRUCK, "F-150", 2001, 60000));
    allCars.add(new Car(CarType.VAN, "Sienna", 1999, 40000));

    Car max = Collections.max(allCars, new Comparator<Car>() {
        @Override
        public int compare(Car o1, Car o2) {
            return o1.getType().compareTo(o2.getType());
        }
    });
    System.out.println(max);
}

static class Car {

    public static enum CarType {

        SEDAN,
        COUPE,
        VAN,
        SUV,
        TRUCK;
    }
    private CarType type;
    private String model; // Focus, Corolla, Camry, Taurus etc
    private int year;
    private long mileage;

    public Car(CarType type, String model, int year, long mileage) {
        this.type = type;
        this.model = model;
        this.year = year;
        this.mileage = mileage;
    }
    //getters
    //toString
}

この場合max、リストの最初のトラックである「Sierra」です。

SortedSetまたは、 like aを使用することもできますが、 equals と一貫性を保つ必要があるため、実装には細心の注意TreeSetを払う必要があります。そうしないと、ランクが同じでも単純に無視されないアイテムが無視されてしまいます。Comparatorequals

編集

enum内部で aを使用Stringし、コンストラクターでaを使用する例:

static class Car {

    public static enum CarType {

        Sedan,
        Coupe,
        Van,
        SUV,
        Truck;
    }
    private CarType type;
    private String model; // Focus, Corolla, Camry, Taurus etc
    private int year;
    private long mileage;

    public Car(String type, String model, int year, long mileage) {
        this.type = CarType.valueOf(type);
        this.model = model;
        this.year = year;
        this.mileage = mileage;
    }
    //getters
    //toString
}
于 2013-04-19T00:49:54.980 に答える
2

CarType enum を導入するのは良い方法ですが、タイプを文字列に変更できない/変更したくない場合は、Orderingより強力で洗練された流暢なComparatorAPI である Guava を使用できます。あなたの場合、使用Ordering#explicit(T, T...)

final Car maxRank = Ordering.explicit("Sedan", "Coupe", "Van", "SUV", "Truck")
    .onResultOf(CarFunction.GET_TYPE)
    .max(allCars);
System.out.println(maxRank.getModel()); // Sierra

は次のようにCarFunction.GET_TYPE定義されます。

private enum CarFunction implements Function<Car, String> {
  GET_TYPE {
    @Override
    public String apply(final Car car) {
      return car.getType();
    }
  };
}

またはprivate static final FunctionJava 8 として lambda としてc -> c.getType()

この Wiki ページで注文の詳細を読むことができます。

于 2013-04-19T09:19:51.937 に答える