存储POJO数组 - java中更好的选择是什么?

时间:2012-09-18 01:10:41

标签: java android collections pojo

我从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相当陌生。所以任何带方向的代码示例都会有所帮助。

谢谢!

2 个答案:

答案 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);