Archive for the 'NSOrderedSet' Category

2017/11/20 主要なタイムゾーンのカレンダーの開始曜日を取得して集計

macOS内に定義されているタイムゾーン(knownTimeZoneNames)のカレンダーの開始曜日を取得して、firstWeekdayを集計するAppleScriptです。

取得するScriptに集計部分を追加しただけのものです。

AppleScript名:主要なタイムゾーンのカレンダーの開始曜日を取得して集計
– Created 2017-11-15 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
–http://piyocast.com/as/archives/4990

property NSDate : a reference to current application’s NSDate
property NSCalendar : a reference to current application’s NSCalendar
property NSOrderedSet : a reference to current application’s NSOrderedSet
property NSLocale : a reference to current application’s NSLocale
property NSCountedSet : a reference to current application’s NSCountedSet
property NSMutableArray : a reference to current application’s NSMutableArray
property NSTimeZone : a reference to current application’s NSTimeZone

set currentCalendar to NSCalendar’s currentCalendar()
set tzList to (NSTimeZone’s knownTimeZoneNames()) as list

set fList to {}
repeat with i in tzList
  set j to contents of i
  (
currentCalendar’s setLocale:(NSLocale’s localeWithLocaleIdentifier:j))
  
  
set aTZ to (NSTimeZone’s timeZoneWithName:j)
  
set theComponents to (currentCalendar’s componentsInTimeZone:aTZ fromDate:(NSDate’s |date|()))
  
set tmpCalend to theComponents’s calendar()
  
  
set aFirstDay to (tmpCalend’s firstWeekday) as integer –firstWeekday: 1=Sunday, 2=Monday
  
set the end of fList to aFirstDay
end repeat

set aRes to calcFrequency(fList) of me
–> {{theKey:1, theCount:371}, {theKey:2, theCount:66}}

–1D Listのデータを各要素ごとに出現頻度集計
on calcFrequency(fList)
  set f2List to makeUniqueListFrom(fList) of me
  
  
set theCountedSet to NSCountedSet’s alloc()’s initWithArray:fList
  
set newArray to NSMutableArray’s new()
  
repeat with i in f2List
    (newArray’s addObject:{theKey:i, theCount:(theCountedSet’s countForObject:i)})
  end repeat
  
return newArray as list
end calcFrequency

–リスト内容のユニーク化
on makeUniqueListFrom(theList)
  set theSet to NSOrderedSet’s orderedSetWithArray:theList
  
return (theSet’s array()) as list
end makeUniqueListFrom

★Click Here to Open This Script 

2014/11/21 1D Listのユニーク化(asoc) 処理内容比較

1D Listのユニーク化の方法について、Shane Stanleyからいろいろと助言をもらいました。

Shaneは処理速度について高速化のために提案してくれたのですが、10万アイテムのListに対して10回計測で平均をとってみたら、「いずれも高速ではあるものの、それほど変わらない」という結果に(#1より#2,#3の方が微妙に高速)。

問題は、ユニーク化したあとの結果。ソートされているものもあれば、されていないものもある、という状況。

少々疑問点があったので、小数点以下の値やマイナスの値などいろいろ突っ込んで追試に次ぐ追試を行ってみたところ・・・数値リストのユニーク化については、結果はどれも「ソートずみの値」として使ってはいけないということに。

uniquify.png

AppleScript名:listのユニーク化(asoc)_method1
– Created 2014-11-19 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”

set aList to {-1, 4, 4, 4, 4, 4, 1, 2, 3, 1, 2, 1.1, -1.1}

set aArray to current application’s NSArray’s arrayWithArray:aList
set bArray to aArray’s valueForKeyPath:“@distinctUnionOfObjects.self”

set bList to bArray’s ASify() as list
–> {3, -1, 1, 1.1, -1.1, 4, 2}

★Click Here to Open This Script 

AppleScript名:listのユニーク化(asoc)_method2
–By Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”

set aList to {-1, 4, 4, 4, 4, 4, 1, 2, 3, 1, 2, 1.1, -1.1}

set theSet to current application’s NSOrderedSet’s orderedSetWithArray:aList
set bArray to theSet’s array() – get set’s items as array
set bList to bArray’s ASify() as list
–> {-1, 4, 1, 2, 3, 1.1, -1.1}

★Click Here to Open This Script 

AppleScript名:listのユニーク化(asoc)_method3
–By Shane Stanley
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”

set aList to {-1, 4, 4, 4, 4, 4, 1, 2, 3, 1, 2, 1.1, -1.1}

set theSet to current application’s NSSet’s setWithArray:aList
set bArray to theSet’s allObjects() – get set’s items as array
set bList to bArray’s ASify() as list
–>{3, -1, 1, 1.1, -1.1, 4, 2}

★Click Here to Open This Script