按特定参数对对象列表进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按特定参数对对象列表进行排序相关的知识,希望对你有一定的参考价值。

我有和具有多个参数的对象的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());
}

对不起,如果这个问题再次出现,我一直在寻找,但找不到适合我的答案。非常感谢你提前!

答案
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));

另一答案

您可以尝试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());
另一答案

您可以在函数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));

以上是关于按特定参数对对象列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用比较器按特定顺序对对象列表进行排序

Android-java-如何按对象内的某个值对对象列表进行排序

如何在不同时间按不同参数对列表进行排序

Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

如何以字符串格式按日期对对象列表进行排序?

Vue.js - 如何按特定属性对数组中的对象进行排序并使用“v-for”进行渲染