我怎樣才能List<Object> filteredList
其ID(Object.id
)含有來自另一List<Object>allObjects
給定List<id> idsList
。 考慮到數據量適中,什麼纔是解決這個問題的有效方法。從id包含在目錄列表<object>獲取所有對象<long>
我使用的Java6
我怎樣才能List<Object> filteredList
其ID(Object.id
)含有來自另一List<Object>allObjects
給定List<id> idsList
。 考慮到數據量適中,什麼纔是解決這個問題的有效方法。從id包含在目錄列表<object>獲取所有對象<long>
我使用的Java6
我不想重複這兩個列表這麼多次
爲什麼?過早優化是一件壞事。首先進行測試,測量它是否足夠有效,如果存在,則解決問題。
你可以做到這一點,使用一個簡單的過濾器流:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
優勢與流做的是,你可以稍後parallelise它。
另外一個優化是檢查你對數據結構的使用。作爲Seelenvirtuose指出,使用像HashSet
東西會從O(n)的降低的contains
複雜O(1):
final Set<Long> rollNoList = new HashSet<>();
如果你不能做到這一點,你也可以看到一些性能增益,在內存使用增加的成本,通過過濾之前複製List
成HashSet
:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
但如果你有在數據結構控制,只需使用HashSet
從一開始。
實際上,首先將'List
當他使用這段代碼轉向這個任務時,這會很有趣,他試圖解釋它在做什麼。 –
@rabbitguy我通常反對爲初學者建議基於流的答案,但我希望這很明顯,這是做什麼。 – Michael
那麼你最好開始研究它。堆棧溢出不是一個請求/履行類型的網站...這是一個問答和一個網站 – CraigR8806
題外話:很少有「通用最有效」的東西。這取決於實際使用情況 – ControlAltDel
請至少提及您使用的是哪個Java版本 – Alexandr