2017-07-14 41 views
-5

我怎樣才能List<Object> filteredList其ID(Object.id)含有來自另一List<Object>allObjects給定List<id> idsList。 考慮到數據量適中,什麼纔是解決這個問題的有效方法。從id包含在目錄列表<object>獲取所有對象<long>

我使用的Java6

+7

那麼你最好開始研究它。堆棧溢出不是一個請求/履行類型的網站...這是一個問答和一個網站 – CraigR8806

+0

題外話:很少有「通用最有效」的東西。這取決於實際使用情況 – ControlAltDel

+0

請至少提及您使用的是哪個Java版本 – Alexandr

回答

6

我不想重複這兩個列表這麼多次

爲什麼?過早優化是一件壞事。首先進行測試,測量它是否足夠有效,如果存在,則解決問題

你可以做到這一點,使用一個簡單的過濾器流:

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<>(); 

如果你不能做到這一點,你也可以看到一些性能增益,在內存使用增加的成本,通過過濾之前複製ListHashSet

final Set<Long> rollNumbers = new HashSet<>(rollNoList); 

但如果你有在數據結構控制,只需使用HashSet從一開始。

+1

實際上,首先將'List '轉換爲'Set '更合理。這樣,對'ids.contains'的調用將是O(1)而不是O(n)的成本。不這樣做顯然更低效。 – Seelenvirtuose

+0

當他使用這段代碼轉向這個任務時,這會很有趣,他試圖解釋它在做什麼。 –

+1

@rabbitguy我通常反對爲初學者建議基於流的答案,但我希望這很明顯,這是做什麼。 – Michael

相關問題