Извлечение всех значений из GLib GTree - PullRequest
0 голосов
/ 02 декабря 2018

Я построил GLib GTree, который содержит пары ключ / значение, где ключ - это символ (например, «a»), а значение - это частота, с которой этот символ появляется в строке.Например, если строка была 'aaa', то единственным элементом в дереве был бы: 'a' => 3.

Что я хочу сделать, это выполнить итерацию по дереву и вести подсчет числасимволов с заданной частотой, то есть там, где значение пары ключ / значение совпадает.

Псевдокод будет выглядеть примерно так:

frequency_count = 0
while (current_element = get_next_element)
  if (current_element->value == desired_frequency)
    frequency_count = frequency_count + 1

Есть ли способ сделать это с помощьюGTree?Единственная функция, которую я могу найти, это g_tree_foreach(), но для этого требуется, чтобы я передал функцию обратного вызова, которая возвращает TRUE, чтобы прекратить обход дерева, и я не хочу останавливать обход, пока не посетил каждый элемент.Должен ли я использовать параметр gpointer user_data функции обратного вызова для передачи подсчета частоты и желаемых значений частоты?

1 Ответ

0 голосов
/ 03 декабря 2018

Должен ли я использовать параметр gpointer user_data функции обратного вызова для передачи счетчика частоты и требуемых значений частоты?

Да.

Пример:

typedef struct
{
  guint desired_frequency;
  guint n_matches;
} MatchData;

static gboolean
n_nodes_matching_frequency_cb (gpointer key,
                               gpointer value,
                               gpointer user_data)
{
  MyTreeElement *element = value;
  MatchData *data = user_data;

  if (element->value == data->desired_frequency)
    data->n_matches++;

  return FALSE;
}

guint
n_nodes_matching_frequency (GTree *tree,
                            guint  desired_frequency)
{
  MatchData data = { desired_frequency, 0 };
  g_tree_foreach (tree, n_nodes_matching_frequency_cb, &data);
  return data.n_matches; 
}
...