質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • C#

    7406questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

漢数字および上中下をナチュラルなかたちで並べるプログラム

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 671

startnote

score 16

エクスプローラorコマンドプロンプトについて相談です。

●dirの結果
2016/05/06  12:14                 0 〇.txt
2016/05/06  12:14                 0 一.txt
2016/05/06  12:14                 0 七.txt
2016/05/06  12:14                 0 三.txt
2016/05/06  12:14                 0 上.txt
2016/05/06  12:14                 0 下.txt
2016/05/06  12:14                 0 中.txt
2016/05/06  12:14                 0 九.txt
2016/05/06  12:14                 0 二.txt
2016/05/06  12:14                 0 五.txt
2016/05/06  12:14                 0 八.txt
2016/05/06  12:14                 0 六.txt
2016/05/06  12:14                 0 十.txt
2016/05/06  12:14                 0 千.txt
2016/05/06  12:14                 0 参.txt
2016/05/06  12:14                 0 四.txt
2016/05/06  12:14                 0 壱.txt
2016/05/06  12:14                 0 弐.txt
2016/05/06  12:14                 0 百.txt

●エクスプローラ
〇.txt
一.txt
壱.txt
下.txt
九.txt
五.txt
三.txt
参.txt
四.txt
七.txt
十.txt
上.txt
千.txt
中.txt
二.txt
弐.txt
八.txt
百.txt
六.txt

というのが、漢数字および上中下を並べた結果なのです。
これをナチュラルなかたちで並べるプログラムをC#で作って、エクスプローラorコマンドプロンプトに組み込むことはできますか?
dirk(k for 漢数字)というプログラムならできそうで、

string[] files = Directory.GetFiles();
List<string> otherfiles = new List<string>();
List<string> file01s = new List<string>();
List<string> file02s = new List<string>();
以下くり返し

foreach(string file in files){
 if (Path.GetFileName(file).StartsWith("一")) file01s.Add(file);
以下くり返し

 else otherfiles.Add(file);
}
foreach(string file in file01s)
 Console.WriteLine(file)
foreach(string file in file02s)
 Console.WriteLine(file)
以下くり返し
foreach(string file in otherfiles)
 Console.WriteLine(file)
のように、いちど分けてから出力する、みたいなのは思いついたのです。
もっとスマートなorなにかすごいノウハウorエクスプローラに組み込める方法などをご存じできたらご示唆ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tkturbo

    2016/05/06 12:49

    「理想的にはどのように出力されるべきか」を追記して頂いてもよいですか?

    キャンセル

  • startnote

    2016/05/06 18:10

    一壱二弐三参四五六七八九〇十百千 上中下 とかかなと思います。

    キャンセル

回答 1

checkベストアンサー

0

「漢数字と一部の特殊文字のみを特別な順序で並べ替えたい」という要望でいいですか?
(とりあえずその前提でコードを書いてみましょう。)

A群:漢数字(〇~十、百、千)
B群:旧字体の漢数字(壱、弐、参)
C群:一部の特殊文字(上、中、下)

と仮定し、さらに全体として、A群→B群→C群→その他の文字の順で並べ替えるのであれば「List#Sort()」を拡張してやればよいのではないでしょうか?

/* クラス内のstatic変数 */
static char[] SpecialSortValues = {
  /* A群 */ '〇','一','二','三','四','五','六','七','八','九','十','百','千',
  /* B群 */ '壱','弐','参',
  /* C群 */ '上','中','下'
  };
/* 並べ替え部分 */
string[] files = Directory.GetFiles();
List<string> fileNames = new List<string>();
foreach(string file in files){
  fileNames.Add(Path.GetFileName(file));
}
// List#Sortの拡張
fileNames.Sort(delegate(string a, string b){
  // 両方nullなら同順
  if(a == null && b == null) return 0;
  // 片方nullならnullが先
  if(a == null) return -1;
  if(b == null) return 1;
  // 先頭文字をcharで取得:特殊な並び順に該当するかをチェック
  int indA = Array.IndexOf(SpecialSortValues, a[0]);
  int indB = Array.IndexOf(SpecialSortValues, b[0]);
  // 両方が特殊な並び順に該当する場合、特殊な並び順で比較
  if(indA > -1 && indB > -1) return indA-indB;
  // 片方が特殊な並び順に該当する場合、特殊な並び順の文字が先
  if(indA > -1) return -1;
  if(indB > -1) return 1;
  // 特殊な並び順に該当しない場合、通常の並び順
  return a.CompareTo(b);
});
foreach(string file in fileNames){
  Console.WriteLine(file);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/06 18:17

    ありがとうございます。
    これ、エクスプローラに組み込むのはたいへんですか?

    キャンセル

  • 2016/05/06 18:21

    コマンドプロンプトで使用するならexe形式でコンパイルし、環境変数PATHにそのexeファイルのフルPathを追加してあげれば行けると思います。
    MSのExplorerに組み込むのはちょっと難易度が高いのではないでしょうか。。。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7406questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。