我正在尋找基于公共id
鍵合并兩個未排序集合的最快方法。
低于 O(N^2) 實作
for (Person per : pers) {
for (Data data : datas) {
if (per.getId().equals(data.getId())) {
per.getData().add(data);
}
}
}
我正在尋找最快的方法(和盡可能低的記憶體占用)來實作這個結果,可能是 O(N)。應該從 per.getData() 中洗掉重復項。現在, per.getData() 是一個 HashSet
知道如何優化嗎?我正在使用 Java 11
uj5u.com熱心網友回復:
對人員進行一次傳遞以收集到地圖中以供以后 O(1) 查找,然后進行一次傳遞將其添加到人員的資料:
Map<Object, Person> people = pers.stream()
.collect(Collectors.toMap(Person::getId, p -> p));
datas.forEach(d -> people.get(d.getId()).add(d));
如果資料可能有匹配的人,則過濾掉不匹配的資料:
datas.stream()
.filter(d -> people.containsKey(d.getId()))
.forEach(d -> people.get(d.getId()).add(d));
兩種方式都是O(m n)(m人,n資料),因為所有的map操作都是O(1)。
您提到應該從個人資料中洗掉重復項。作為一個HashSet(或任何型別的Set),重復被自動洗掉,如果equals()
和hashCode()
正確的資料編碼。
uj5u.com熱心網友回復:
這是一種比 O(n^2) 更好但會使用記憶體的線性方法 (O(n))。
- 創建一個 HashMap<personId, personObject> 然后回圈人物并將他們插入到地圖中。
- 回圈 Datas 并檢查 dataId 是否存在于 HashMap 中。如果存在,則獲取 personObject 并將 dataObject 添加到其 HashSet。
HashMap<Integer, Person> mp = new HashMap<>();
for (Person per : pers) {
mp.put(per.getId(), per);
}
for (Data data : datas) {
if (mp.get(data.getId()) != null) {
Person person = mp.get(data.getId());
person.getData().add(data);
mp.put(person.getId(), person);
}
}
請注意,我假設您使用整數作為 Id。您可以更改代碼以適合您的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382373.html