さて、オブジェクトのカウントですが、色々なやり方があります。
今回は、HashTableを使った考えていなかった方法があったのでご紹介です。
#PSTip Count occurrences of a word using a hash table
カウント対象
計測対象は以下の文字の個数です。
'three','three','one','three','two','two'
私ならどうするか
私の場合はこのように考えます。
$wordList = 'three','three','one','three','two','two'
$wordList | group $_ | %{[PSCustomObject]@{Value=$_.Name;Count=$_.Count}} | sort Value
改行入れるならこうです。
$wordList = 'three','three','one','three','two','two'
$wordList `
| group $_ `
| %{
[PSCustomObject]@{
Value=$_.Name;
Count=$_.Count}
} `
| sort Value
Format-Tableでの結果です。
Value Count
----- -----
one 1
three 3
two 2
牟田口先生の案
なるほど…PSCustomObjectはなるべく避けたいか…、納得です。
$wordList = 'three','three','one','three','two','two'
$wordList | group -NoElement $_
結果表示です。
Count Name
----- ----
3 three
1 one
2 two
紹介するやり方
うまくHashTableを使ってます
$wordList = 'three','three','one','three','two','two'
$wordStatistic = $wordList | ForEach-Object -Begin { $wordCounts=@{} } -Process { $wordCounts.$_++ } -End { $wordCounts }
$wordStatistic
結果表示です。
Name Value
---- -----
one 1
three 3
two 2
HashTableのインクリメントでの使い方、面白いです。
PowerShellというより、AWK的な考えな感じもしますがとても興味深かったので参考にどうぞw
単純にこれでは
まぁSelectでもいい気もしますが…んー色々あって余りSelectを使うのは好きじゃないです。
$wordList = 'three','three','one','three','two','two'
$wordList | group $_ | Select Name,Count
Format-Tableでの結果です。
Name Count
---- -----
three 3
one 1
two 2
速度
ちなみに速度的には…さてさてw
# 私のやり方
TotalSeconds : 0.0004608
# 牟田口先生のやり方
TotalSeconds : 0.0002187
# 紹介したHashTableのやり方
TotalSeconds : 0.00331
# groupしてselect
TotalSeconds : 0.0004079
なるほ、牟田口先生のやり方でいきましょう。