我有一个
树图地图 = 新树图();
根据选择标准将文档中的值存储在视图中。map 将创建日期存储为键,将文档值存储为对象。
在对象中,我有一个“表单”字段。文件可以有不同的形式(备忘录、通知、传真等)
我有一个返回 allEntries 的方法。没关系,可以按预期工作。
我现在想在表单字段上进行选择以仅返回地图中文档的子集。
有人能指出我正确的方向吗?
由于您要在不是地图键的内容上进行选择,因此您必须遍历所有项目。
如果你可以使用外部库,你可以使用Collections2.filter()
谷歌的guava 库。IE
TreeMap<Date, Document> map = ...;
final String formValue = "notice";
Collection<Document> result = Collections2.filter(map.values(), new Predicate<Document>() {
public boolean apply(Document input) {
return formValue .equals(input.getForm());
}
}
您可以使用 2 个地图来存储数据。
一个简单的 Hashmap 足以存储与备忘录通知等对应的 id,并作为值存储包含当前格式的所有相应数据的 Treemap。
您可以 1) 遍历所有值并将这些匹配条件放入新集合 2) 将其存储在其他集合中(单独的变量或 Map> (或类似的东西,考虑使用 set 而不是 List)
1)较慢的检索,2)较慢的删除,更多的内存消耗
番石榴图书馆工作,但有点矫枉过正。所以我结束了以下
TreeMap<String, Object> mapFiltered = new TreeMap<String, Object>();
LinkedList<CommunicationDocumentEntry> map = new LinkedList<CommunicationDocumentEntry>();
public Collection<Object> getAllEntries(String frm, boolean order) {
this.mapFiltered.clear();
Iterator<CommunicationDocumentEntry> itr = this.map.iterator();
while (itr.hasNext()) {
CommunicationDocumentEntry entry = itr.next();
if (EMPTY_STRING.equals(frm) || frm == null) {
this.mapFiltered.put(entry.getDateCreated(), entry.getEntry());
} else {
if (entry.getForm().toUpperCase().equals(frm.toUpperCase())) {
this.mapFiltered.put(entry.getDateCreated(), entry.getEntry());
}
}
}
if (order) {
return this.mapFiltered.descendingMap().values();
} else {
return this.mapFiltered.values();
}
}
当然不完美,但对我有用......