1

I am trying to get an ordered list of vehicles using Native Query in Java.

I am using two methods, the first to get the vehicles, and the second method to order the list.

I get this error:

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)

Here is my code:

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;
 }

What am I doing wrong?

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 回答