2011-06-20 36 views
0

我有這樣的對象列表:「查詢」 列表

ArrayList<Phone> list = new ArrayList(); 
list.add(new Phone("+44 20 8765 4321", "mobile", "26")); 
list.add(new Phone("+44 20 8765 4322", "home", "23")); 
list.add(new Phone("+44 20 8765 4323", "mobile", "27")); 
list.add(new Phone("+44 20 8765 4324", "work", "26")); 
list.add(new Phone("+44 20 8765 4325", "home", "27")); 
list.add(new Phone("+44 20 8765 4326", "home", "26")); 

(23,26,27是ID接觸的的)。如何「查詢」此列表以獲取具有多個電話號碼{"26", "27"}的聯繫人的ID?

我需要最佳的解決方案,不會將很多小對象存儲到內存中(我糟糕的實現會導致GC頻繁運行,長時間凍結手機)。

+0

一般來說,你沒有。在這種情況下,我建議使用'Map >'作爲您的數據結構,或者使用後備數據存儲來存儲具有適當關係的信息。 – aroth

+0

@ zorglub76:「..有多個電話號碼的聯繫人..」我有一個移動電話但沒有固定電話(沒有電話@「家」)。所以你的邏輯是錯誤的。 –

+0

你可以顯示,電話類的代碼?或者只是講述Phone類的數據字段的名稱。 –

回答

0

你可以使用這個算法嗎?

Set<String> dupIds = new HashSet<String>(); 
Set<String> set = new HashSet<String>(); 

for (Phone p: list) { 
    if (set.contains(p.id)) { 
    dupIds.add(p.id); 
    } else { 
    set.add(p.id); 
    } 
} 

dupIds包含重複的ID在該過程結束時,我沒有看到這裏正在創建太多的小對象。

+0

我想過做這樣的事情,但我害怕在記憶中擁有那麼多物體。但是誰知道,我稍後會嘗試你的解決方案... – zorglub76

+0

請注意,由於您正在存儲'p.id',因此您不會將其複製到新字符串中。即使對於數百萬個項目,HashSet的開銷也可以忽略不計。如果你正在談論數組列表中的數百萬個電話號碼,那麼最好使用SQLLite。我不知道你的使用案例,但我幾乎想不出任何需要存儲在設備上的許多電話號碼的事情。你正在離線「黃頁」應用程序? :) –

+0

哈哈 - 不,它實際上是一個Android應用程序,它處理存儲在手機中的聯繫人。有500多個聯繫人,垃圾收集器變得非常繁忙,並凍結應用程序長達半分鐘(我之前從服務器獲取Json,然後將json中的數字與手機中存儲的數據進行比較)。也許這一切都可以很容易地解決,如果你知道這個問題的答案在這裏:http://stackoverflow.com/questions/6404689/all-contacts-that-have-more-than-one-phone-number – zorglub76