【发布时间】:2017-08-10 04:15:56
【问题描述】:
我的源文件包含给定日期的许多产品的文本 CSV 行。我想使用 Rust 整理这些文件,以便最终得到许多新的目标 CSV 文件,每个产品一个,每个包含仅特定于该产品的行的部分。
我当前的解决方案是遍历源文件的行并使用HashMap<String, String> 来收集每个产品的行。我拆分每个源行并使用包含产品 ID 的元素作为键,以在我的HashMap 中获得一个Entry(占用或空置)。如果它是空的,我会使用一个新的String 来初始化该值,该值是预先分配给给定容量的,以便之后我可以有效地附加到它。
// so far, so good (the first CSV item is the product ID)
let mystringval = productmap.entry(splitsource[0].to_owned()).or_insert(String::with_capacity(SOME_CAPACITY));
然后我想将同一源代码行的格式化元素附加到这个Entry。网上有很多例子,比如
https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.entry
如果HashMap 值是整数,如何使这项工作:
// this works if you obtain an Entry from a HashMap containing int vals
*myval += 1;
我还没有想出如何使用这种语法将更多文本附加到我从HashMap<String, String> 获得的Entry,并且我已经尽力在网上研究示例。在 Rust 数据结构中操作非数字条目的例子非常少。
// using the Entry obtained from my first code snippet above
*mystringval.push_str(sourcePortion.as_str());
尝试编译它会产生以下错误:
error: type `()` cannot be dereferenced
--> coll.rs:102:17
|
102 | *mystringval.push_str(sourcePortion.as_str());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如何在Entry 值内附加String?
【问题讨论】:
-
只需
mystringval.push_str(sourcePortion.as_str())就可以了。你可以试一试吗? -
是的,确实如此。我想这让我感到惊讶的是,我看到的所有更改 HashMap 条目的示例都包括取消引用字符。你介意写一个答案,包括为什么我的案子不需要那个吗?我很乐意将其标记为已接受。
标签: string hashmap rust append memory-efficient