1

Java でネイティブ クエリを使用して、車両の順序付きリストを取得しようとしています。

私は 2 つの方法を使用しています。1 つ目は車両を取得する方法で、2 つ目はリストを並べ替える方法です。

次のエラーが表示されます。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.set(AbstractList.java:132)
    at java.util.AbstractList$ListItr.set(AbstractList.java:426)
    at java.util.Collections.sort(Collections.java:159)
    at Exercici4.AzizElamraniOrdreMatricula(Exercici4.java:246)
    at Exercici4.main(Exercici4.java:45)

これが私のコードです:

private static final String BBDDFITXER = "fitxer";

public static void main(String[] args) 
{
    new File(BBDDFITXER).delete();
    ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), BBDDFITXER);

    try {
        Cotxe c3 = new Cotxe("B1432-hk", 10000, true);
        Cotxe c1 = new Cotxe("B54w2-hk", 566666, true);
        Cotxe c2 = new Cotxe("Bwc345-ABC", 13456, true);
        Cotxe c4 = new Cotxe("Ba432th", 10000, true);
        Moto m1 = new Moto("B5756474", 1000, 500);
        Moto m2 = new Moto("6575-YT", 2345454, 250);

        db.store(c3);
        db.store(c1);
        db.store(c2);
        db.store(c4);
        db.store(m1);
        db.store(m2);   

        List<Vehicle> vehicles = AzizElamraniOrdreMatricula(db);
        consultaVehicles(vehicles);

    }finally{
        db.close();
    }
}

public static List<Vehicle> AzizElamraniNQ3(ObjectContainer db) 
{
    List<Vehicle> vehicles = db.query(new Predicate<Vehicle>() 
    {
     public boolean match(Vehicle vehicle) {
        return vehicle.getKm() < 50000
                && vehicle.getMatricula().startsWith("B");
         }
    });
    return vehicles;
}

 public static void consultaVehicles(List<Vehicle> vehicles) {
     System.out.println("total: " + vehicles.size());
     for (Vehicle v : vehicles) {
        System.out.println(v.infoVehicle());
     }
 }

 public static List<Vehicle> AzizElamraniOrdreMatricula(ObjectContainer db) {

     List<Vehicle> vehiclesdes = AzizElamraniNQ3(db);
     Collections.sort(vehiclesdes);

     return vehiclesdes;
 }

私は何を間違っていますか?

4

2 に答える 2

1

取得したdb.queryリストは変更可能なリストではなく、リストをCollections.sort変更してソートします。これを修正するには、新しいリストを作成して、代わりに並べ替えることができます。メソッドAzizElamraniOrdreMatriculaは次のようになります。

public static List<Vehicle> AzizElamraniOrdreMatricula(ObjectContainer db) {
    List<Vehicle> vehiclesdes = new ArrayList<Vehicle>(AzizElamraniNQ3(db));
    Collections.sort(vehiclesdes);

    return vehiclesdes;
}
于 2014-02-27T18:12:14.420 に答える
0

db.queryはい、固定リストを返すのは正しいです。以下の例を参照してください。java.lang.UnsupportedOperationException がスローされます。

public class UnsupportedExceptionDemo {

public static void main(String[] args) {

String[] valStrings = { "Java", "Unsupported", "Test" };

List<String> list = Arrays.asList(valStrings);

for (Iterator<String> iterator = list.iterator(); 
        iterator.hasNext();) {
    String string = iterator.next();
    iterator.remove();
}

}

}

理由: Arrays.asList(String… a) メソッドを呼び出すと、指定された配列に基づく固定サイズのリストが返されるため、リストを変更しようとすると、つまり値を追加または削除しようとすると、UnsupportedOperationException がスローされます。それを修正するには、LinkedList を使用します

于 2014-04-05T01:37:43.120 に答える