如何在 nim 中按键对 CountTable 进行排序?

How to sort a CountTable by key in nim?

nim中,我有一个CountTable:

var
  sizeFreqs = initCountTable[int]()

我想按键进行数字排序,而 sizeFreqs.sort() 将按计数进行排序。

我不明白 documentation 关于 nim 中的排序。

非常感谢关于排序的一些一般性指导,因为我想实现的第二种情况是如果使用 wordsFreqs = initCountTable[string]() 而不是按字符串长度排序。

谢谢 安德里亚

我会将 table 的键提取到 seq,然后命令 seq 将其用作某种索引:

import algorithm  # This provides "sort"

var index: seq[char]

for k in sizeFrequencies.keys:
  index.add k

index.sort()

对于第二种情况,可以传一个过程给sort:

proc lenSort(x, y: string): int =
  if x.len == y.len:
    return 0
  elif x.len > y.len:
    return 1
  else:
    return -1

然后:

let myString = @["AAA", "BBB", "BB", "AA", "A", "BBB", "BB", "BB", "BB"]
var wordFrequencies = initCountTable[string]()

for c in myString:
  wordFrequencies.inc(c)

var index: seq[string]

for k in wordFrequencies.keys:
  index.add k

echo wordFrequencies
# Prints {"BBB": 2, "A": 1, "AA": 1, "AAA": 1, "BB": 4}

wordFrequencies.sort
echo wordFrequencies
# Sorted by word count, prints
# {"BB": 4, "BBB": 2, "A": 1, "AA": 1, "AAA": 1}

index.sort(lenSort)
echo index
# Prints @["A", "AA", "BB", "BBB", "AAA"]

注意,最后的排序是stable,也就是说,长度相同的项目(在本例中为“BBB”和“AAA”,例如)保留与CountTable相同的顺序。

使用 index 您可以对 CountTable 进行虚拟排序,例如:

for i in index:
    echo echo i, " -> ", wordFrequencies[i]

# A -> 1
# AA -> 1
# BB -> 4
# BBB -> 2
# AAA -> 1