簡體   English   中英

根據Java中的屬性對對象數組進行排序

[英]Sort an array of object based on an attribute in Java

我正在嘗試基於給定的基於Storage盒上的Summary信息選擇Storage盒的算法。 為了檢索(摘要對象的)具有最高numItems屬性(摘要對象的)的標識符,我必須對Summary[]進行排序,該對象數組是一個對象數組,但是我只是不知道如何排序屬性。

我發現了創建ArrayList<Int> a = new ArrayList<Int>();許多示例ArrayList<Int> a = new ArrayList<Int>(); 然后使用Collections獲得最大價值,但是在這里,我對其他屬性感興趣,而我只是無法想象如何做到這一點。 你能幫我嗎?

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中,要使用屬性獲取對象數組中的最大元素,請對Comparator.comparingInt()使用Stream#max() Comparator.comparingInt()

return Stream.of(summaries)
    .max(Comparator.comparingInt(s -> s.numItems))
    .orElseThrow(() -> new NoBoxReadyException())
    .identifier;

如果沒有Java 8,則可以將Collections.max()與自定義Comparator

try {
    return Collections.max(Arrays.asList(summaries), new Comparator<StorageBox.Summary>() {
        @Override
        public int compare(StorageBox.Summary s1, StorageBox.Summary s2) {
            return Integer.compare(s1.numItems, s2.numItems);
        }
    }).identifier;
} catch (NoSuchElementException nsee) {
    throw new NoBoxReadyException();
}

或者您可以使用標准的for循環自己實現它:

if (summaries.length == 0)
    throw new NoBoxReadyException();
StorageBox.Summary max = summaries[0];
for (int i = 1; i < summaries.length; i++)
    if (summaries[i].numItems > max.numItems)
        max = summaries[i];
return max.identifier;

如果您熟悉Java 8 Streams,可以執行以下操作:

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.comparingInt()方法

也許您想要使用的是public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) api,它具有用於確定最大元素的比較器。 空值表示應使用元素的自然順序。

您可以使用比較器對-

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

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

        return o1.numItems.compareTo(o2.numItems);
    }           
});

或使用Collections API和Comparator來檢索最大

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

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

                return o1.numItems.compareTo(o2.numItems);
            }           
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM