在Java中,根据属性对对象数组进行排序

在Java中,根据属性对对象数组进行排序,java,arrays,Java,Arrays,我正在尝试改进给定的算法,根据盒子上的摘要信息选择存储盒子。为了检索具有最高numItems属性(summary object)的标识符(summary object的标识符),我必须对summary[]进行排序,这是一个对象数组,但我不知道如何按属性排序 我发现了许多创建arraylista=newarraylist()的例子然后使用集合获得最大值,但在这里,我对其他属性感兴趣,我只是无法想象我将如何做到这一点。你能帮忙吗 public String selectNextDelivery(St

我正在尝试改进给定的算法,根据盒子上的
摘要
信息选择
存储
盒子。为了检索具有最高numItems属性(summary object)的标识符(summary object的标识符),我必须对
summary[]
进行排序,这是一个对象数组,但我不知道如何按属性排序

我发现了许多创建
arraylista=newarraylist()的例子
然后使用
集合
获得最大值,但在这里,我对其他属性感兴趣,我只是无法想象我将如何做到这一点。你能帮忙吗

public String selectNextDelivery(StorageBox.Summary[] summaries) throws NoBoxReadyException {
    if (summaries.length != 0) {
        for(StorageBox.Summary summary : summaries){
            if (summary.numItems > 0) {
                return summary.identifier;
            }
        }
    }
    // Otherwise no box is ready
    throw new NoBoxReadyException();
}

如果您熟悉Java 8流,可以执行以下操作:

Stream.of(summaries) //creating custom comparator which sorts based on identifier
    .sort(($1, $2) -> Integer.compare($1.identifier, $2.identifier))
    //Do something with your stream
如果要从按某个属性排序的流中获取第一个元素,可以执行以下操作:

 Stream.of(summaries)
     .max(Comparator.comparingInt(StorageBox.Summary::getIdentifier))
     .orElse(null);

感谢4castle指出Comparator.comparingit()方法如果您熟悉Java 8流,您可以执行以下操作:

Stream.of(summaries) //creating custom comparator which sorts based on identifier
    .sort(($1, $2) -> Integer.compare($1.identifier, $2.identifier))
    //Do something with your stream
如果要从按某个属性排序的流中获取第一个元素,可以执行以下操作:

 Stream.of(summaries)
     .max(Comparator.comparingInt(StorageBox.Summary::getIdentifier))
     .orElse(null);

感谢4castle指出了一个比较器。comparingit()方法

也许你想要的是使用
公共静态T max(集合也许你想要的是使用
公共静态T max(集合你可以使用比较器排序-

Arrays.sort(summaries, new Comparator<Summary>() {

    @Override
    public int compare(Summary o1, Summary o2) {

        return o1.numItems.compareTo(o2.numItems);
    }           
});
Arrays.sort(摘要,新的比较器(){
@凌驾
公共整数比较(汇总o1,汇总o2){
返回o1.numItems.compareTo(o2.numItems);
}           
});
或者使用Collections api和比较器来检索最大值

Summary maxSummary = Collections.max(Arrays.asList(summaries), 
                                   new Comparator<Summary>() {

            @Override
            public int compare(Summary o1, Summary o2) {

                return o1.numItems.compareTo(o2.numItems);
            }           
        });
Summary maxSummary=Collections.max(Arrays.asList(summaries),
新比较器(){
@凌驾
公共整数比较(汇总o1,汇总o2){
返回o1.numItems.compareTo(o2.numItems);
}           
});

您可以使用比较器进行排序-

Arrays.sort(summaries, new Comparator<Summary>() {

    @Override
    public int compare(Summary o1, Summary o2) {

        return o1.numItems.compareTo(o2.numItems);
    }           
});
Arrays.sort(摘要,新的比较器(){
@凌驾
公共整数比较(汇总o1,汇总o2){
返回o1.numItems.compareTo(o2.numItems);
}           
});
或者使用Collections api和比较器来检索最大值

Summary maxSummary = Collections.max(Arrays.asList(summaries), 
                                   new Comparator<Summary>() {

            @Override
            public int compare(Summary o1, Summary o2) {

                return o1.numItems.compareTo(o2.numItems);
            }           
        });
Summary maxSummary=Collections.max(Arrays.asList(summaries),
新比较器(){
@凌驾
公共整数比较(汇总o1,汇总o2){
返回o1.numItems.compareTo(o2.numItems);
}           
});

在Java 8中,要使用属性获取对象数组中的最大元素,请使用with

如果没有Java 8,您可以使用自定义的:


在Java8中,要使用属性获取对象数组中的最大元素,请使用with

如果没有Java 8,您可以使用自定义的:


您所需要做的就是实现一个Comparator接口。已经有很多方法可以对对象集合进行交互排序,您不需要立即从列表中返回一个元素,而是查看所有元素,然后通过在
摘要
cla中实现它来返回您可以使用的最大值
Comparable
接口ss@mojtab23哦,我不小心漏掉了这一部分-我做了一些搜索,我确实遇到了实现可比较接口的情况,但根据学校作业的要求,我不能触摸摘要类。我必须在这里处理它。为什么需要对整个数组进行排序以找到最大值?您只需要实现一个比较接口。这里有ready有许多方法可以对对象集合进行交互排序,您不需要立即从列表中返回元素,而是查看所有元素,然后通过在您的
摘要中实现它来返回您可以使用的
Compariable
接口的最大值class@mojtab23哦,我不小心漏掉了那部分-我做了一些小动作earch和我确实遇到过实现类似接口的情况,但根据学校作业的要求,我无法触摸Summary类。我必须在这里处理它。为什么需要对整个数组进行排序以找到最大值?同时使用
sort
findFirst
是一种过分的做法。它将O(n)操作变成了O(nlogn)同时使用
sort
findFirst
是过分的。它使O(n)操作变成O(nlogn)您没有提到,但此方法位于类中。它非常有用,但不允许自定义异常。您没有提到,但此方法位于类中。它非常有用,但不允许自定义异常。