0

我有从 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 集合和泛型还很陌生。因此,任何带有方向的代码示例都会有所帮助。

谢谢!

4

2 回答 2

4

五百个帐户并不是一个很大的数字,如果您的应用程序很小并且很少使用(这意味着它不是具有数千个同时查询的 Web 服务),您可能能够摆脱线性搜索。

假设情况并非如此,并且这似乎是一个很好的假设,您应该为那些您希望经常查询的字段建立索引。如果您主要搜索名称,则可以使用名称的小写版本构建哈希图

nameIndex = new HashMap<String, Account>();
for (Account a : accountArray) {
    nameIndex.put(a.name.toLowerCase(), a);
}

然后对于“确切名称”搜索小写您搜索查询然后调用nameIndex.get.

也可以按日期搜索,但在这里我希望您将按日期范围搜索。在这种情况下,您可能想要构建排序列表索引或树索引。然后导航列表或树以找到所需的范围。

您还可以通过名称正则表达式或我的姓名接近度(二元组、三元组)进行查找,有很多选项。

顺便说一句,数据库在这种事情上做得很好。您可能会考虑只填充像H2这样的嵌入式数据库,尽管这可能是矫枉过正?不过学起来很有趣。除了使用数据库之外,您还可以获得并发控制和 freeeeeeee 缓存!

TL;DR:为您经常使用的查询构建哈希图或树图或普通排序列表索引,并对复杂的自定义查询进行线性搜索。或者,这可能是首选:使用嵌入式数据库。

于 2012-09-18T01:27:08.333 回答
2

如果您正在搜索,并且您可以识别要搜索的单个键,我建议您使用HashMap,因为如果您有一个键,访问它是 O(1) 。

HashTable是 JDK 1.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-18T01:12:49.623 回答