Сортировать список объектов по определенному аргументу - PullRequest
0 голосов
/ 09 октября 2018

У меня есть и ArrayList объектов, которые имеют несколько аргументов.Мне нужно сделать метод, который сортирует список по определенному аргументу.Мой класс:

public class VehicleLoaded {

private int vlrefid;
private int vehicleRefId;
private int load_time;
...

public ELPEVehicleLoaded(){}
}

Мне нужно отсортировать ArrayList, который содержит такие объекты, по времени загрузки (в порядке возрастания).Вот мой компаратор:

public static Comparator<ELPEVehicleLoaded> RouteLoadingTime = new Comparator<ELPEVehicleLoaded>() 
{
    public int compare(ELPEVehicleLoaded vl1, ELPEVehicleLoaded vl2) {

    int vl1_load_time=vl1.getLoadTime();

    int vl2_load_time=vl2.getLoadTime();
    /*For ascending order*/
    return vl1_load_time-vl2_load_time;
}};

Поэтому я создал статический метод для сортировки:

public static void sortListByLoadTime (ArrayList<VehicleLoaded> VLs){
Collections.sort(VLs, new MyComparator());
}

Извините, если этот вопрос был снова поднят, я искал, но не смогне могу найти ответ, который меня устраивает.Большое спасибо заранее!

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете использовать comparator внутри своей функции sortListByLoadTime, как показано ниже:

VLs.sort((o1,o2) -> o1.getLoadTime() - o2.getLoadTime());

Или вы можете использовать Collections utility, как показано ниже:

Collections.sort(VLs, ( o1,  o2) -> {
      return o1.getLoadTime() - o2.getLoadTime();
});

lambda expression можно заменить на method reference, как показано ниже:

Collections.sort(VLs, Comparator.comparing(VehicleLoaded::getLoadTime));
0 голосов
/ 09 октября 2018

Вы можете попробовать Java 8 способом:

VLs.stream()
    .sorted((v1,v2)-> {
        if(v1.getLoadTime()<v2.getLoadTime()) {
            return -1;
        }
        if(v1.getLoadTime()>v2.getLoadTime()) {
            return 1;
        }
        return 0;
    }).collect(Collectors.toList());
0 голосов
/ 09 октября 2018
public class HelloWorld {
    public static void main(String[] args) {
        List<MyObj> a = Arrays.asList(new MyObj(5), new MyObj(4),new MyObj(3),new MyObj(2), new MyObj(1));

        Collections.sort(a, Comparator.comparingInt(MyObj::getLoadTime));

        System.out.println(a);
    }
}

class MyObj {
    int loadTime;

    public MyObj(int loadTime) {
        this.loadTime = loadTime;
    }

    public int getLoadTime() {
        return loadTime;
    }

    @Override
    public String toString() {
        return "" + loadTime;
    }
}

Вывод этого будет:

[1, 2, 3, 4, 5]

Так что в вашем случае все, что вам нужноДобавьте к вашему sortListByLoadTime метод:

Collections.sort(VLs, Comparator.comparingInt(ELPEVehicleLoaded::getLoadTime));

и, поскольку мы говорим о ArrayList, вы должны использовать его метод сортировки, а не Collections :: sort.В приведенном мной примере это будет выглядеть так:

Collections.sort(VLs, Comparator.comparingInt(ELPEVehicleLoaded::getLoadTime));->VLs.sort(Comparator.comparingInt(ELPEVehicleLoaded::getLoadTime));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...