C# で ASCII 文字列をソートすると良いことがありそうか確認した
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
背景・目的
テキストを行単位で配列に格納して、 for ループで配列を検索していると、どうしても大容量データだと時間がかかります。
使える時は限定的になりますが、ソートを活用して検索したい配列をひとかたまりにしてしまえば、処理の時間が削減できる気がしたので、とりあえず、 ASCII 文字列をソートした時の並び順を確認することにしました。
動作環境
・Windows 7
・Visual Studio 2017
プログラム
ASCII 文字列を昇順と降順にソートして、ファイルに出力する C# のソースコードを書きました。
ソースコード
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sort_ASCII
{
class Program
{
static void Main(string[] args)
{
// 出力用ディレクトリ
string sDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
// 出力用変数
string originASCII = "";
string ascendingASCII = "";
string descendingASCII = "";
// 印字可能な ASCII 文字列配列作成
string[] ASCII = new string[] { " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~" };
for(int i=0; i < ASCII.Length; i++)
{
originASCII += string.Format("{0,3}", ASCII[i]);
}
// 昇順ソート
Array.Sort(ASCII);
for (int i = 0; i < ASCII.Length; i++)
{
ascendingASCII += string.Format("{0,3}", ASCII[i]);
}
// 降順ソート
Array.Reverse(ASCII);
for (int i = 0; i < ASCII.Length; i++)
{
descendingASCII += string.Format("{0,3}", ASCII[i]);
}
// 出力
File.WriteAllText(sDir + "\\" + "Sort-ASCII.txt", originASCII);
File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", Environment.NewLine);
File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", ascendingASCII);
File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", Environment.NewLine);
File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", descendingASCII);
}
}
}
結果
結果は図1 の通りとなりました。
上段、中段、下段の内容はそれぞれ以下の通りです。
上段:初期の並び順
中段:昇順
下段:降順
横長になってしまったので、スクロールできるようにしました。
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
' - ! " # $ % & ( ) * , . / : ; ? @ [ ] ^ _ ` { | } ~ \ + < = > 0 1 2 3 4 5 6 7 8 9 a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z
Z z Y y X x W w V v U u T t S s R r Q q P p O o N n M m L l K k J j I i H h G g F f E e D d C c B b A a 9 8 7 6 5 4 3 2 1 0 > = < + \ ~ } | { ` _ ^ ] [ @ ? ; : / . , * ) ( & % $ # " ! - '
コメント
このソースコードを流用することはないと思いますが、 ASCII の昇順、降順で並び順の変わり方が分かりました。
A B C などのアルファベットの並び順はおいといて、 @ や & 、 $ といった文字は覚えておいても良いでしょう。
決まった書式で書かれた文字列配列から、先頭が @ から始まる文字列だけを抽出する場合などはソートしてから検索して、 @ が検出されなくなったら、ループ脱出すれば、無駄なループを待つ必要がなくなります。
ただし、ファイル入力時間、ソート時間を考慮すると意味が無いかもしれません。
以上