Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“查询”;单子_Java_Android_Collections - Fatal编程技术网

Java &引用;“查询”;单子

Java &引用;“查询”;单子,java,android,collections,Java,Android,Collections,我有这样一个对象列表: 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("+4

我有这样一个对象列表:

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"));
ArrayList list=new ArrayList();
增加(新电话(“+442087654321”,“手机”,“26”));
添加(新电话(“+442087654322”,“家”,“23”));
增加(新电话(“+442087654323”,“手机”,“27”));
添加(新电话(“+442087654324”,“工作”,“26”));
添加(新电话(“+442087654325”,“家”,“27”));
添加(新电话(“+442087654326”,“home”,“26”));
(23、26、27为联系人的id)。如何“查询”此列表以获取具有多个电话号码的联系人的ID
{“26”、“27”}


我需要一个不会将许多小对象存储到内存中的最佳解决方案(我糟糕的实现导致GC频繁运行,导致手机长时间冻结)。

你能使用这个算法吗

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);
  }
}
Set dupIds=new HashSet();
Set=newhashset();
电话号码(p:列表){
if(集合包含(p.id)){
添加(p.id);
}否则{
集合。添加(p.id);
}
}

dupIds
在进程结束时包含重复的id,我看不到这里创建了太多的小对象。

一般来说,您不会看到。在这种情况下,我建议使用
地图
作为您的数据结构,或者使用备份数据存储来存储具有适当关系的信息。@zorglub76:“…具有多个电话号码的联系人…”我有一个移动电话,但没有地面线路(没有电话@
主页
)。所以你的逻辑是错误的。你能显示电话类的代码吗?或者只告诉我Phone类的数据字段的名称。@Andrew-你将无法进入新列表-你将是一个只有一个电话号码的联系人@pankaj-该类的字段都是字符串(“数字”、“联系人ID”、“电话类型”、“联系人名称”)@zorglub76:起初我以为“26”等是电话类型。我的错。我想做这样的事情,但我害怕记忆中有那么多的对象。但谁知道呢,我稍后会尝试您的解决方案……请注意,因为您存储的是
p.id
,所以您没有将其复制到新字符串。即使对于数百万项,哈希集的开销也可以忽略不计。如果您正在谈论阵列列表中的数百万个电话号码,那么最好使用SQLLite。我不知道您的使用情况,但我几乎想不出有什么东西需要在设备上存储这么多电话号码。您是否正在脱机制作
黄页
应用程序?:)哈哈-不,它实际上是一个Android应用程序,处理手机中存储的联系人。有了500多个联系人,垃圾收集器会非常忙,并将应用程序冻结长达半分钟(我以前从服务器获取Json,然后将Json中的数字与手机中存储的数字进行比较)。如果你知道这个问题的答案,也许所有这些问题都可以很容易地解决:我不知道你做了什么在设备上加载了这样的负载,但是两个包含500个条目的字符串散列集和非常标准的访问模式不会引起任何问题。我还认为500个联系人不是什么大问题,直到我撞到墙上(还发现了这个:)