0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ぷよクエをたのしく!アプリをつくってみよう!(おまけ:特徴語ソート3)

0
Posted at

辞書順ソートにしたい&特徴語中の数値比較

前回は、特徴語をグルーピング(辞書順)にするのに先頭1文字目に着目した。
https://qiita.com/puyon/items/149c100e85fec842999f

でも、特徴語中に数値が入っている場合は、うまく比較していないっぽい。

元ネタを用意

今度は違うゲーム攻略サイト情報で「ブルーアーカイブ」から引用してみた。
「ブルーアーカイブ」は、こういう内容が顕著にあらわれるみたい。

ソートの元ネタ

最も低い味方1人,
(13秒間),
(クールタイム5秒),
(クールタイム20秒),
(16秒間),
味方4人,
(8秒間),
敵1人,
(1.4秒間),
(戦闘中に1回のみ),
洗礼25秒毎,
(24.3秒間),
決断20秒毎,
ディレイ5回無視,
射撃準備、OK!10秒間移動,
ノワールシュート25秒毎,
敵1人に対して、攻撃力,
火力支援、開始40秒毎,
(3.1秒間),
(3.9秒間),
応援35秒毎,
(5秒間),
(15秒間),
生徒1人毎,
(自身は除外し、最大3人分まで),
(6.2秒間),
(21秒間),
(クールタイム10秒),
敵5人に対して、順番,
最も低い味方1人に対して治癒力,
手榴弾投擲25秒毎,
(クールタイム25秒),
(4.1秒間),
底力25秒毎,
トリガーオーバー20秒毎,
敵4人,
最も高い敵1人,
sagittamortis30秒毎,
ウォーミングアップ40秒毎,
最も高い味方1人,
締切厳守30秒毎,
猛撃15秒毎,
集中治療セットA味方1人,
緊急治療セットB35秒毎,
味方1人に対して治癒力,
学習サポート30秒毎,
(30秒),
盗聴30秒毎,
(33秒間),
(クールタイム8秒),
(最大で2段階まで),
(2.9秒間),
指名手配25秒毎,
エキゾチック30秒毎,
(クールタイム15秒),
(26秒間),
(クールタイム18秒),
栄養剤35秒毎,
(10秒間),
秘技!爆裂手裏剣!通常攻撃6回毎,
!25秒毎,
(50秒間),
水上襲撃40秒毎,
粛清君1号、出撃!,
粛清君1号、出撃!粛清君1号,
洗礼敵1人,
連携30秒毎,
攻撃力14.3%分,
(48秒間),
(40秒間),
(2.7秒間),
(5.3秒間),
〜50秒毎,
(20秒間),
(23秒間),
(1.1秒間),
(全3段階),
術!通常攻撃6回毎,
(23秒),
応援45秒毎,
(25秒間),
除く味方3人,
水分補給30秒毎,
(90秒間),
リロード/,敵1人に対して攻撃力,
広域射撃、開始25秒毎,
即時射撃25秒毎,
一撃25秒毎,
補給プランB45秒毎,
一点突破40秒毎,
(46秒間),
(2.5秒間),
(32秒間),
情熱30秒毎,
情熱砲30秒毎,
/,20秒後、攻撃力,
(7.5秒間),
イントゥ・ザ・バックドア30秒毎,
一撃通常攻撃5回毎,
命中した敵1体に対して、攻撃力,
除く味方1人,
スローアンドノックアウト20秒毎,
(2秒間),
最大2コスト,
スポーツ射撃25秒毎,
,敵1人に対して、攻撃力,
(2.34秒間),
(55秒間),
(最大2回まで),
(3秒間),
!30秒毎,
味方5人,
ー30秒毎,
味方1人,
コーラス50秒毎,
(56秒間),
(36秒間),
除き味方1人に対して治癒力,
(EXスキルの使用1回分),
快刀乱麻25秒毎,
連続コンボ!25秒毎,
(6秒間),
緊急出動緊急車両11号,
登場中、緊急車両11号,
エネルギー剤注入40秒毎,
支援30秒毎,
カブトムシシールド!40秒毎,
iralitore35秒毎,
集中砲火40秒毎,
(1.6秒間),
(5.5秒間),
クレイモア40秒毎,
(5.1秒間),
制圧射撃35秒毎,
……!20秒毎,
最も高い敵1人に対して攻撃力,
強化25秒毎,
(120秒間),
(「聖夜の祝福」は最大15個まで重複),
プレゼントセットC通常攻撃21回毎,
(60秒間),
信念40秒毎,
(17秒間),
…通常攻撃21回毎,
(35秒間),
試食タイム!60秒毎,
発動3回毎,
(7秒間),
最大3コスト,
情報収集35秒毎,
身支度40秒毎,
(5コスト),
使用時1、2撃目,
戦術的判断35秒毎,
ダメージ,EXスキル2回使用時:攻撃力,
ダメージ,EXスキル3回使用時:攻撃力,
AfternoonTea50秒毎,
(40秒間),
加護40秒毎,
(25秒間),
(50秒間),
精神統一50秒毎,
ハイスコアアタック30秒毎,
攻撃力223%分,
秘密道具40秒毎,
ポーズ!50秒毎,
治癒力43.1%分,
(1秒間),
,1番目、4番目,
(60秒間),
破竹之勢通常攻撃8回毎,
**1693%**分,
(20秒),
飛行ドローン稼働敵1人,
紫外線対策30秒毎,
援護射撃通常攻撃15回毎,
攻撃力1117%分,
(EXスキル使用1回分),
攻撃力834%分,
(25秒),
(45秒),
貫通特効28.9%加算,
(30秒),
,100%チャージ,
ダメージ,攻撃力329%分,
設定崩壊!通常攻撃3回毎,
力30秒毎,
(20秒),
アプローチ40秒毎,
連絡網30秒毎,
,攻撃力432.5%分,
攻撃力1034%分,
攻撃力228%分,
ダメージ+攻撃力157%分,
(40秒),
攻撃力847%分,
サバカレー45秒毎,
(最大3人),
攻撃力1468%分,
(5秒),
攻撃力604%分,
攻撃力302%分,
(15秒),
攻撃力501.5%分,
(22秒),
時、攻撃力8.6%分,
攻撃力480%分,
計略30秒毎,
(最大3個),
(1回分),
味方6人,
(30秒間),
自信作45秒毎,
(26秒),
(上限15個),
攻撃力24.3%増加,
(11.5秒),
共鳴効果45秒毎、自身,
(35秒),
(22秒間),
変更,3個以下:942%分,
ダメージ,4個〜7個:攻撃力,
ダメージ,8個〜11個:攻撃力,
ダメージ,12個以上:攻撃力,
ダメージ,6人〜10人:攻撃力,
ダメージ,11人以上:攻撃力,
EX1、2回目,直線範囲内,
,EX3回目,直線範囲内,
戦闘中1回発動,
(16秒),
(13秒/CT5秒),
増加,1個:攻撃速度,
ノーマルスキル,13秒毎,
攻撃力553%ダメージ召喚中,
攻撃力22.6%増加,
(7秒間),
ベースチューニング35秒毎,
(26秒間),
階段通常攻撃12回毎,
(16秒間/クールタイム5秒),
(50秒),
ビジュアルメーカー通常攻撃10回毎,
敵1体,
使用時5.5秒間、,通常攻撃,
(23秒間),
(10秒間),
(クールタイプ10秒),
敵1体に対して攻撃力,
ハイドロストライク35秒毎,
ダメージ,5発,
特製ハンディファン通常攻撃12回毎,
バカンス満喫4.5秒毎,
(40秒間),
休息30秒毎,
プレート交換40秒毎,
(効果20秒/,
クールタイム5秒),
手榴弾投擲・改40秒毎,
時、15秒間、退却猶予,
(クールタイム90秒),
(35秒間),
カチューシャ30秒毎,
,0個:攻撃力,
戦術的保温対策35秒毎,
(最大6回),
招式:昇龍ノ形30秒毎,
勅令:修身斉家35秒毎,
(17秒),
一番35秒毎,
ナイトケア30秒毎,
勘通常攻撃10回毎,
助言35秒毎,
EXスキル3回目,
(19秒間),
後方支援40秒毎,
(コスト1),
(70秒間),
(コスト4),
ドロー後、味方1人,
(最小0),
解30秒毎,
敵1人に対して防御力,
キラメキ45秒毎,
本気45秒毎,
攻撃力13.2%分,
(21秒間),
(32秒間),
(クールタイム20秒),
**30.6%**増加,
(22秒間),
錦上添花通常攻撃12回毎,
ダメージ,4~6人:攻撃力,
ダメージ,7人以上:攻撃力,
悪霊退散30秒毎,
(24秒間),
プランニング&マネジメント通常攻撃15回毎,
(最大4個まで),
!35秒毎,
爪敵1人,
支援射撃35秒毎,
敵1人に対して会心抵抗値,
(43秒間),
(26秒間),
Crush,Tear,Curl35秒毎,
,敵1人,
(27秒間),
増加,・1〜2回目:コスト4,・3〜4回目:コスト6,・5回目以降:コスト10,
(33秒間),
記録通常攻撃12回毎,
(28秒間),
味方1人毎,
ダメージ,1個以下:攻撃力,
ダメージ,2個~3個:攻撃力,
ダメージ,4個以上:攻撃力,
(18秒間),
(34秒間),
,攻撃力361%分,
(41秒間),
マジカル閃光弾35秒毎,
(27秒間),
累積5個保有時、,
(6.1秒間),
,1人以下:18%増加,2人:24%増加,3人:36%増加,
追加ダメージ/,30%,
敵5人,
パラメータ調整35秒毎,
(最大5回),
(12秒間),
パーフェクトメイド、パーフェクトリコン40秒毎,
(9秒間),
スイッチ30秒毎,
ドッカーン40秒毎,
(1.7秒間),
CSAR味方1人,
ブロークンアロー35秒毎,
解除時、敵1人,
(クールタイム4秒),
封印解除豪速球25秒毎,
決定:強制執行45秒毎,
!敵1人,
ダメージ,3人以上:攻撃力,
!?30秒毎,
I.F.F15秒毎,
(3.5秒間),
破壊工作:プランA30秒毎,
パニックショット20秒毎,
(3.6秒間),

特徴語中に数値を含んでいるかの確認

前回同様。
正規表現を使って数値を含んでいるをチェックするイメージ。
正規表現のマッチング文字列はGeminiにおしえてもらった(#^.^#)。

まずは比較関数は、こんな感じ。
数値を含んでいるかを、再帰的にチェックしていく。

export class WordAnalysisInfo {
    leadingText: string = ``        //数値に先行する文字列
    numeric: number = Number.NaN    //含まれる数値
    text: string = ``
    next: WordAnalysisInfo | null = null
}
/**文字列に数値を含んでいるか解析する */
function containsNumeric(word: string) {
    const containsNum = word.match(/[+-]?[0-9]+(?:\.[0-9]+)?/);
    if (containsNum !== null) {
        const numPos = containsNum.index
        if (numPos !== undefined && numPos >= 1) {
            const left = word.substring(0, numPos)
            const numText = containsNum[0]
            const right = word.substring(left.length + numText.length)
            //console.log(left, numText, right)

            const info = new WordAnalysisInfo()
            info.leadingText = left
            info.numeric = Number(numText)
            info.text = numText

            if (right.trim().length !== 0)
                info.next = containsNumeric(right.trim())

            return info
        }
    }
    return null
}

比較関数を呼び出す。

const words = [
*ソート元ネタたち*
]
export function sortEx05() {
    const isAsc = true
    const sorted = words.sort((a, b) => {
        const aCn = containsNumeric(a)
        const bCn = containsNumeric(b)
        if (aCn !== null && bCn !== null) {
            if (aCn.leadingText === bCn.leadingText) {
                const numComp = isAsc ? aCn.numeric - bCn.numeric : bCn.numeric - aCn.numeric
                if (numComp) return numComp
            }
        }

        return a.localeCompare(b)
    })
    sorted.forEach(w  => { console.log(w) })
}
ソート結果(特徴語中の数値比較)

〜50秒毎
,0個:攻撃力
,1人以下:18%増加,2人:24%増加,3人:36%増加
,1番目、4番目
,100%チャージ
,EX3回目,直線範囲内
,攻撃力361%分
,攻撃力432.5%分
,敵1人
,敵1人に対して、攻撃力
!?30秒毎
!25秒毎
!30秒毎
!35秒毎
!敵1人
……!20秒毎
…通常攻撃21回毎
(「聖夜の祝福」は最大15個まで重複)
(1秒間)
(1.1秒間)
(1.4秒間)
(1.6秒間)
(1.7秒間)
(1回分)
(2秒間)
(2.34秒間)
(2.5秒間)
(2.7秒間)
(2.9秒間)
(5秒)
(10秒間)
(11.5秒)
(13秒/CT5秒)
(15秒)
(16秒)
(17秒)
(20秒)
(22秒)
(25秒間)
(3秒間)
(3.1秒間)
(3.5秒間)
(3.9秒間)
(4.1秒間)
(40秒間)
(5コスト)
(5秒間)
(5.1秒間)
(5.3秒間)
(5.5秒間)
(6秒間)
(6.1秒間)
(6.2秒間)
(7秒間)
(7.5秒間)
(8秒間)
(10秒間)
(12秒間)
(13秒間)
(15秒間)
(16秒間)
(17秒間)
(18秒間)
(19秒間)
(20秒)
(20秒間)
(21秒間)
(21秒間)
(22秒間)
(23秒)
(23秒間)
(24.3秒間)
(25秒間)
(26秒間)
(30秒)
(32秒間)
(33秒間)
(35秒間)
(36秒間)
(40秒間)
(46秒間)
(48秒間)
(50秒間)
(50秒間)
(55秒間)
(56秒間)
(60秒間)
(90秒間)
(120秒間)
(7秒間)
(16秒間/クールタイム5秒)
(22秒間)
(23秒間)
(24秒間)
(25秒)
(26秒)
(26秒間)
(26秒間)
(27秒間)
(3.6秒間)
(30秒)
(30秒間)
(32秒間)
(35秒)
(35秒間)
(40秒)
(9秒間)
(27秒間)
(28秒間)
(33秒間)
(34秒間)
(40秒間)
(41秒間)
(43秒間)
(45秒)
(50秒)
(60秒間)
(70秒間)
(EXスキルの使用1回分)
(EXスキル使用1回分)
(クールタイプ10秒)
(クールタイム20秒)
(クールタイム4秒)
(クールタイム5秒)
(クールタイム8秒)
(クールタイム10秒)
(クールタイム15秒)
(クールタイム18秒)
(クールタイム20秒)
(クールタイム25秒)
(クールタイム90秒)
(コスト1)
(コスト4)
(効果20秒/
(最小0)
(最大2回まで)
(最大3個)
(最大3人)
(最大4個まで)
(最大5回)
(最大6回)
(最大で2段階まで)
(自身は除外し、最大3人分まで)
(上限15個)
(戦闘中に1回のみ)
(全3段階)
**30.6%**増加
**1693%**分
/,20秒後、攻撃力
ー30秒毎
AfternoonTea50秒毎
Crush,Tear,Curl35秒毎
CSAR味方1人
EX1、2回目,直線範囲内
EXスキル3回目
I.F.F15秒毎
iralitore35秒毎
sagittamortis30秒毎
アプローチ40秒毎
イントゥ・ザ・バックドア30秒毎
ウォーミングアップ40秒毎
エキゾチック30秒毎
エネルギー剤注入40秒毎
カチューシャ30秒毎
カブトムシシールド!40秒毎
キラメキ45秒毎
クールタイム5秒)
クレイモア40秒毎
コーラス50秒毎
サバカレー45秒毎
スイッチ30秒毎
スポーツ射撃25秒毎
スローアンドノックアウト20秒毎
ダメージ,1個以下:攻撃力
ダメージ,2個~3個:攻撃力
ダメージ,3人以上:攻撃力
ダメージ,4~6人:攻撃力
ダメージ,4個〜7個:攻撃力
ダメージ,4個以上:攻撃力
ダメージ,5発
ダメージ,6人〜10人:攻撃力
ダメージ,7人以上:攻撃力
ダメージ,8個〜11個:攻撃力
ダメージ,11人以上:攻撃力
ダメージ,12個以上:攻撃力
ダメージ,EXスキル2回使用時:攻撃力
ダメージ,EXスキル3回使用時:攻撃力
ダメージ,攻撃力329%分
ダメージ+攻撃力157%分
ディレイ5回無視
ドッカーン40秒毎
トリガーオーバー20秒毎
ドロー後、味方1人
ナイトケア30秒毎
ノーマルスキル,13秒毎
ノワールシュート25秒毎
パーフェクトメイド、パーフェクトリコン40秒毎
ハイスコアアタック30秒毎
ハイドロストライク35秒毎
バカンス満喫4.5秒毎
パニックショット20秒毎
パラメータ調整35秒毎
ビジュアルメーカー通常攻撃10回毎
プランニング&マネジメント通常攻撃15回毎
プレート交換40秒毎
プレゼントセットC通常攻撃21回毎
ブロークンアロー35秒毎
ベースチューニング35秒毎
ポーズ!50秒毎
マジカル閃光弾35秒毎
リロード/,敵1人に対して攻撃力
悪霊退散30秒毎
一撃25秒毎
一撃通常攻撃5回毎
一点突破40秒毎
一番35秒毎
栄養剤35秒毎
援護射撃通常攻撃15回毎
応援35秒毎
応援45秒毎
加護40秒毎
火力支援、開始40秒毎
解30秒毎
解除時、敵1人
快刀乱麻25秒毎
階段通常攻撃12回毎
学習サポート30秒毎
勘通常攻撃10回毎
貫通特効28.9%加算
記録通常攻撃12回毎
休息30秒毎
共鳴効果45秒毎、自身
強化25秒毎
錦上添花通常攻撃12回毎
緊急治療セットB35秒毎
緊急出動緊急車両11号
計略30秒毎
決断20秒毎
決定:強制執行45秒毎
後方支援40秒毎
広域射撃、開始25秒毎
攻撃力13.2%分
攻撃力14.3%分
攻撃力22.6%増加
攻撃力24.3%増加
攻撃力223%分
攻撃力228%分
攻撃力302%分
攻撃力480%分
攻撃力501.5%分
攻撃力553%ダメージ召喚中
攻撃力604%分
攻撃力834%分
攻撃力847%分
攻撃力1034%分
攻撃力1117%分
攻撃力1468%分
最も高い敵1人
最も高い敵1人に対して攻撃力
最も高い味方1人
最も低い味方1人
最も低い味方1人に対して治癒力
最大2コスト
最大3コスト
使用時1、2撃目
使用時5.5秒間、,通常攻撃
指名手配25秒毎
支援30秒毎
支援射撃35秒毎
紫外線対策30秒毎
試食タイム!60秒毎
時、15秒間、退却猶予
時、攻撃力8.6%分
治癒力43.1%分
自信作45秒毎
射撃準備、OK!10秒間移動
手榴弾投擲・改40秒毎
手榴弾投擲25秒毎
集中治療セットA味方1人
集中砲火40秒毎
粛清君1号、出撃!
粛清君1号、出撃!粛清君1号
術!通常攻撃6回毎
助言35秒毎
除き味方1人に対して治癒力
除く味方1人
除く味方3人
招式:昇龍ノ形30秒毎
情熱30秒毎
情熱砲30秒毎
情報収集35秒毎
信念40秒毎
身支度40秒毎
水上襲撃40秒毎
水分補給30秒毎
制圧射撃35秒毎
生徒1人毎
精神統一50秒毎
設定崩壊!通常攻撃3回毎
戦術的判断35秒毎
戦術的保温対策35秒毎
戦闘中1回発動
洗礼25秒毎
洗礼敵1人
増加,・1〜2回目:コスト4,・3〜4回目:コスト6,・5回目以降:コスト10
増加,1個:攻撃速度
即時射撃25秒毎
勅令:修身斉家35秒毎
追加ダメージ/,30%
爪敵1人
底力25秒毎
締切厳守30秒毎
敵1人
敵1人に対して、攻撃力
敵1人に対して会心抵抗値
敵1人に対して防御力
敵1体
敵1体に対して攻撃力
敵4人
敵5人
敵5人に対して、順番
登場中、緊急車両11号
盗聴30秒毎
特製ハンディファン通常攻撃12回毎
破壊工作:プランA30秒毎
破竹之勢通常攻撃8回毎
発動3回毎
秘技!爆裂手裏剣!通常攻撃6回毎
秘密道具40秒毎
飛行ドローン稼働敵1人
封印解除豪速球25秒毎
変更,3個以下:942%分
補給プランB45秒毎
本気45秒毎
味方1人
味方1人に対して治癒力
味方1人毎
味方4人
味方5人
味方6人
命中した敵1体に対して、攻撃力
猛撃15秒毎
力30秒毎
累積5個保有時、
連携30秒毎
連続コンボ!25秒毎
連絡網30秒毎

ソート結果から、このあたりだったり、

ダメージ,1個以下:攻撃力
ダメージ,2個~3個:攻撃力
ダメージ,3人以上:攻撃力
ダメージ,4~6人:攻撃力
ダメージ,4個〜7個:攻撃力
ダメージ,4個以上:攻撃力
ダメージ,5発
ダメージ,6人〜10人:攻撃力
ダメージ,7人以上:攻撃力
ダメージ,8個〜11個:攻撃力
ダメージ,11人以上:攻撃力
ダメージ,12個以上:攻撃力
ダメージ,EXスキル2回使用時:攻撃力
ダメージ,EXスキル3回使用時:攻撃力
ダメージ,攻撃力329%分
ダメージ+攻撃力157%分

このあたり、意図したとおりソートできてるっぽい。

攻撃力13.2%分
攻撃力14.3%分
攻撃力22.6%増加
攻撃力24.3%増加
攻撃力223%分
攻撃力228%分
攻撃力302%分
攻撃力480%分
攻撃力501.5%分
攻撃力553%ダメージ召喚中
攻撃力604%分
攻撃力834%分
攻撃力847%分
攻撃力1034%分
攻撃力1117%分
攻撃力1468%分

2個以上を含む場合にも比較関数では対応しているけど、ソートの中では利用していない。
まぁ実用上、ほぼ問題ないような気がする(#^.^#)。

結論

辞書順ソートは、前回のように先頭1文字を比較し、特徴語中の数値を順に比較すれば、かなりの精度が出るような気がした(#^.^#)。

ちなみに、ソートの比較処理で、かなり凝った実装を入れても、3000件程度ならほぼ一瞬で終了する感覚を得た。

あくまで個人的観測まで(#^.^#)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?