【问题标题】:"Querying" a list“查询”列表
【发布时间】:2011-06-20 07:00:50
【问题描述】:

我有一个这样的对象列表:

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 频繁运行,长时间冻结手机)。

【问题讨论】:

  • 一般来说,你不会。在这种情况下,我建议使用 Map&lt;Contact, List&lt;Phone&gt;&gt; 作为您的数据结构,或使用后备数据存储来存储具有适当关系的信息。
  • @zorglub76:“..拥有多个电话号码的联系人..”我有手机但没有固定电话(没有电话@home)。所以你的逻辑是错误的。
  • 你能展示一下Phone类的代码吗?或者只是告诉电话类的数据字段的名称。
  • @Andrew - 你不会进入新列表 - 你将成为一个只有一个电话号码的联系人。 @pankaj - 类的字段都是字符串(“number”、“contactId”、“phoneType”、“contactName”)
  • @zorglub76:起初我以为“26”等是电话类型。我的错。

标签: java android collections


【解决方案1】:

你能用这个算法吗?

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,我没有看到这里创建了太多的小对象。

【讨论】:

  • 我想过做这样的事情,但我害怕内存中有那么多对象。但是谁知道呢,我稍后会尝试你的解决方案......
  • 请注意,由于您存储的是p.id,因此您不会将其复制到新字符串。即使对于数百万个项目,HashSet 的开销也可以忽略不计。如果您正在谈论数组列表中的数百万个电话号码,您可能最好使用 SQLLite。我不知道您的用例,但我几乎想不出任何需要在设备上存储这么多电话号码的东西。您是否正在制作离线Yellow Pages 应用程序? :)
  • 大声笑 - 不,它实际上是一个处理存储在手机中的联系人的 Android 应用程序。拥有 500 多个联系人时,垃圾收集器会变得非常忙碌,并将应用程序冻结长达半分钟(我之前从服务器获取了一个 Json,然后将来自 json 的数字与存储在手机中的数字进行比较)。如果您在这里知道这个问题的答案,也许这一切都可以轻松解决:stackoverflow.com/questions/6404689/…
  • 我不知道你做了什么来给设备带来这样的负载,但是两个包含 500 个条目的字符串哈希集和非常标准的访问模式不会造成任何问题。
  • 我还以为500个联系人没什么大不了的,直到碰壁(还发现了这个:stackoverflow.com/questions/5716346/…
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多