3

我有一个

树图地图 = 新树图();

根据选择标准将文档中的值存储在视图中。map 将创建日期存储为键,将文档值存储为对象。

在对象中,我有一个“表单”字段。文件可以有不同的形式(备忘录、通知、传真等)

我有一个返回 allEntries 的方法。没关系,可以按预期工作。

我现在想在表单字段上进行选择以仅返回地图中文档的子集。

有人能指出我正确的方向吗?

4

4 回答 4

4

由于您要在不是地图键的内容上进行选择,因此您必须遍历所有项目。

如果你可以使用外部库,你可以使用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());
    }
}
于 2012-09-06T07:16:02.220 回答
0

您可以使用 2 个地图来存储数据。

一个简单的 Hashmap 足以存储与备忘录通知等对应的 id,并作为值存储包含当前格式的所有相应数据的 Treemap。

于 2012-09-06T07:13:52.073 回答
0

您可以 1) 遍历所有值并将这些匹配条件放入新集合 2) 将其存储在其他集合中(单独的变量或 Map> (或类似的东西,考虑使用 set 而不是 List)

1)较慢的检索,2)较慢的删除,更多的内存消耗

于 2012-09-06T07:18:07.957 回答
0

番石榴图书馆工作,但有点矫枉过正。所以我结束了以下

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();
    }
}

当然不完美,但对我有用......

于 2012-09-06T11:33:07.003 回答