我有从JSON解析的POJO。
Account [] accounts;
class Account {
Integer number;
String name;
String location;
Date started;
}
我从JSON API调用中获得帐户列表。Jackson mapper将生成的JSON映射到上述POJO。我需要对这些对象进行搜索和其他操作。
我不确定如何存储这些来做搜索和显示它们(在Android中)。
ArrayList
Map
HashTable
...
等。搜索应该是快速的。我平均有大约500个账号。映射完成了,现在我有了数组中的对象。但不知道该怎么做。
更重要的是,我对Java集合和泛型还很陌生。因此,任何带有方向的代码示例都会有所帮助。
谢谢!
发布于 2012-09-18 09:12:50
如果您正在搜索,并且可以确定要搜索的单个键,我建议使用HashMap
,因为如果您有一个键,那么访问它的值是O(1)。
HashTable
是JDK1.0版本;请不要选择它。
下面是一个例子,假设这个数字是唯一的,并且代表了一个很好的搜索选择:
Account a = new Account(123456);
Map<Integer, Account> accounts = new HashMap<Integer, Account>();
accounts.put(a.getNumber(), a);
要进行访问,请使用以下编号:
Account b = accounts.get(123456);
发布于 2012-09-18 09:27:08
500个帐户并不是一个很大的数字,如果你的应用程序很小,使用很少(这意味着它不是一个同时有数千个查询的get服务),那么你可能就可以通过线性搜索逃脱惩罚。
假设情况并非如此,这似乎是一个很好的假设,您应该为那些需要经常查询的字段构建索引。如果您主要根据名称进行搜索,则可以使用名称的小写版本构建hashmap
nameIndex = new HashMap<String, Account>();
for (Account a : accountArray) {
nameIndex.put(a.name.toLowerCase(), a);
}
然后,对于“精确名称”搜索,您可以搜索查询,然后调用nameIndex.get
。
按日期搜索也是可能的,但在这里我希望您将按日期范围进行搜索。在这种情况下,您可能需要构建排序列表索引或树索引。然后导航列表或树以查找所需的范围。
您还可以通过名称正则表达式或我的名称近似度(二元语法、三元语法)进行查找,有很多选项。
顺便说一句,数据库在这方面做得很好。您可能会考虑只填充像H2这样的嵌入式数据库,尽管这可能有些过分了?不过,学习起来很有趣。此外,使用数据库,您可以获得并发控制和freeeeeeee的缓存!
DR:为经常使用的查询构建hashmap或treemap或简单排序列表索引,并对复杂的自定义查询进行线性搜索。或者,最好是这样:使用嵌入式数据库。
https://stackoverflow.com/questions/12469108
复制相似问题