On 4/13/20 7:59 PM, Adnan wrote:
I want to keep an ordered set of records and the standard provides me
with RedBlackTree. The record is of type Tuple!(string, uint). Here's
what it looks like:
import std.json : parseJSON;
uint[string] wordTable;
import std.datetime.stopwatch : StopWatch, AutoStart;
auto sw = StopWatch(AutoStart.yes);
const auto j = parseJSON(get(link));
const long downloadTime = sw.peek.total!"msecs";
import std.typecons : Tuple, tuple;
import std.container.rbtree : RedBlackTree;
import std.functional : binaryFun;
// instead of this:
RedBlackTree!(Tuple!(string, uint), binaryFun!("a[1] > b[1]"))
records;
// do this: (note you don't need binaryFun)
auto records = new RedBlackTree!(Tuple!(String, uint), "a[1] >
b[1]");
foreach (node; j["posts"].array()) {
import std.stdio : writeln;
import std.utf : decode;
if ("com" in node) {
import std.algorithm : splitter;
foreach (word; getStr(node["com"].str()).splitter(' ')) {
import std.string : strip;
if (word.strip().length > 0)
wordTable.require(word, 0)++;
records ~= (tuple(word, wordTable[word])); // error
}
}
}
Now primarily I used `insert()` method to add a record to the records
but it causes segfault in runtime.
Because RedBlackTree is a class, so you need to initialize it with a
call to new.
So I decided to use ~= to see what's
going on. Here's what the compiler says:
Error: cannot append type Tuple!(string, uint) to type
std.container.rbtree.RedBlackTree!(Tuple!(string, uint), binaryFun, false)
Because RedBlackTree doesn't overload appending.
-Steve