2011-06-20 38 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