对数组进行频数统计的计数器在不同语言中对应不同的数据结构,虽然在逻辑上都是键值对
table(arr)
返回一个命名的向量DataStructures.counter()
返回一个
struct,其中包裹的是一个 Dict元素:频率
的键值对## Counting-Duplicates.jl
using DataStructures, Test
"""
duplicatecount(str)
计算str中出现次数多于1次的字符的个数
"""
#> " duplicatecount(str)\n\n计算str中出现次数多于1次的字符的个数\n"
function duplicatecount(str::String)::Int64
= str |> lowercase |> counter
dict # @show dict
# broadcast() 的参数可以是 iterator
# .> 返回 BitVector,可以传给 sum()
sum(values(dict) .> 1)
# filter(>(1), [values(dict)...]) |> length # 等价形式
end
#> duplicatecount (generic function with 1 method)
@testset "Sample tests" begin
@test duplicatecount("") == 0
@test duplicatecount("abcde") == 0
@test duplicatecount("aabbcde") == 2
@test duplicatecount("aabBcde") == 2
@test duplicatecount("Indivisibility") == 1
@test duplicatecount("Indivisibilities") == 2
end
#> Test Summary: | Pass Total
#> Sample tests | 6 6
#> Test.DefaultTestSet("Sample tests", Any[], 6, false, false)
## Counting Duplicates
library(tidyverse)
#' @title 统计字符串中有几个字符的出现次数大于1
<- function(text) {
duplicate_count <- tolower(text) %>%
frequency str_split("") %>%
unlist() %>%
table()
# 向量化写法
sum(frequency > 1)
}
library(testthat)
test_that("Sample Tests", {
expect_equal(duplicate_count(""), 0)
expect_equal(duplicate_count("abcdeaa"), 1)
expect_equal(duplicate_count("Indivisibilities"), 2)
})
#> Test passed 🌈
const Vector = require("../src/JavaScript/toolkit/Vector");
function duplicateCount(text) {
const dict = Vector.counter(text.toLowerCase());
return Object.values(dict).filter(x => x > 1).length;
}
console.log(duplicateCount("Indivisibilities"));
#> 2