[英]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.