我从JSON解析了POJO。
Account [] accounts;
class Account {
Integer number;
String name;
String location;
Date started;
}
我从JSON API调用中获取帐户列表。 Jackson映射器将生成的JSON映射到上面的POJO。 我需要对这些对象进行搜索和其他操作。
我不知道如何存储这些来进行搜索并显示它们(在Android中)。
ArrayList
Map
HashTable
...
等。搜索应该很快。我平均得到大约500个帐户。映射已完成,我现在有一个数组中的对象。但不知道该如何离开这里。
更重要的是,我对Java Collections和Generics相当陌生。所以任何带方向的代码示例都会有所帮助。
谢谢!
答案 0 :(得分:4)
五百个帐户实际上并不是一个庞大的数字,如果您的应用程序很小并且使用很少(意味着它不是一个包含数千个同时查询的Web服务),您可能能够逃脱线性搜索。
假设情况并非如此,这似乎是一个很好的假设,那么您应该为那些您希望经常查询的字段构建索引。如果您将主要搜索名称,则可以使用名称
的小写版本构建散列映射nameIndex = new HashMap<String, Account>();
for (Account a : accountArray) {
nameIndex.put(a.name.toLowerCase(), a);
}
然后,对于“确切名称”搜索小写,您搜索查询然后调用nameIndex.get
。
也可以按日期搜索,但我希望您可以按日期范围进行搜索。在这种情况下,您可能希望构建排序列表索引或树索引。然后导航列表或树以找到所需的范围。
您还可以通过名称正则表达式或我的名字邻近(bigrams,trigrams)进行查找,有很多选项。
BTW,数据库做得很好。您可能会考虑只填充像H2这样的嵌入式数据库,尽管这可能有点过分了?不过,学习很有趣。除了数据库,你还可以获得并发控制和freeeeeeee的缓存!TL; DR:为经常使用的查询构建hashmap或treemap或普通排序列表索引,并对复杂的自定义查询进行线性搜索。或者,这可能是首选:使用嵌入式数据库。
答案 1 :(得分:2)
如果您正在搜索,并且您可以识别要搜索的单个密钥,我建议使用HashMap
,因为如果您有密钥,则可以访问O(1)。
HashTable
是JDK 1.0 vintage;不要选择那个。
这是一个例子,假设这个数字是唯一的,代表了一个很好的搜索选择:
Account a = new Account(123456);
Map<Integer, Account> accounts = new HashMap<Integer, Account>();
accounts.put(a.getNumber(), a);
要访问,请使用数字:
Account b = accounts.get(123456);