C言語関係掲示板

過去ログ

No675 年号のソート

[戻る] [ホームページ]
No.7655

ソートについて(アルゴリズム)
投稿者---初心者(2003/06/21 15:08:29)


漢字の年号、例えば「明治」「大正」「昭和」「平成」を含むリストを古い順にソートしたいのですが、このままではコードの関係でソートできませんよね。このような時はどうすればいいのですか?自分で定義するのですか?(明治<大正など)

No.7659

Re:ソートについて(アルゴリズム)
投稿者---あかま(2003/06/21 18:49:19)


そうですね。あんまりたくさん年号があるときは自分で定義するぐらいしか思いつかないです。

もし年号が「明治」「大正」「昭和」「平成」の4つだけでしたら、
ビット演算で色々遊んでみて見つけました。↓ような感じで出来ます。
「明治」<「大正」<「昭和」<「平成」で、使い方はstrcmpと同じです。

int word_cmp(char *word1,char *word2){
	
	int i = (unsigned char)word1[1]%19;
	int k = (unsigned char)word2[1]%19;
	
	if(i > k){
		return 1;
	}
	else if(i == k){
		return 0;
	}
	else{
	return -1;
	}
	
}


No.7662

Re:ソートについて(アルゴリズム)
投稿者---かずま(2003/06/21 23:22:47)


> もし年号が「明治」「大正」「昭和」「平成」の4つだけでしたら、
> ビット演算で色々遊んでみて見つけました。↓ような感じで出来ます。
> 「明治」<「大正」<「昭和」<「平成」で、使い方はstrcmpと同じです。

面白いですね。では、私も遊んでみましょう。
int cmp_era(const char *a, const char *b)
{
    int i = (a[1] + 2) & 15;
    int j = (b[1] + 2) & 15;

    return (i < j) ? -1 : (i > j);
}
これは、文字コードが Shift-JIS の場合ですが、EUC なら、
    int i = a[1] & 15;
    int j = b[1] & 15;


No.7664

Re:ソートについて(アルゴリズム)
投稿者---かずま(2003/06/21 23:38:35)


strcmp と同じ仕様なら、-1、0、1 ではなく、負、ゼロ、正の値を
返すだけでよいので、もっと簡単になりますね。
int cmp_era(const char *a, const char *b)
{
    return (a[1]+2 & 15) - (b[1]+2 & 15);
}


No.7660

Re:ソートについて(アルゴリズム)
投稿者---none(2003/06/21 22:43:07)


>漢字の年号、例えば「明治」「大正」「昭和」「平成」を含むリストを古い順にソートしたいのですが、このままではコードの関係でソートできませんよね。このような時はどうすればいいのですか?自分で定義するのですか?(明治<大正など)

各元号名にシーケンシャルな番号を振り、
元号名に対応するシーケンシャル番号を返す関数を作成し、
比較の際にはそのシーケンシャル番号を使用し大小判定を行う。
と言う方法はいかがでしょうか?

No.7661

Re:ソートについて(アルゴリズム)
投稿者---TDa(2003/06/21 22:57:38)


>>漢字の年号、例えば「明治」「大正」「昭和」「平成」を含むリストを古い順にソートしたいのですが、このままではコードの関係でソートできませんよね。このような時はどうすればいいのですか?自分で定義するのですか?(明治<大正など)
>と言う方法はいかがでしょうか?

私なら年号から西暦への変換関数を作ってそれでソートしますね。

No.7665

Re:ソートについて(アルゴリズム)
投稿者---こん!(2003/06/21 23:52:58)


>私なら年号から西暦への変換関数を作ってそれでソートしますね。

昭和は1926年?それとも1989年?

1989年は昭和?それとも平成?

どちらにしても年号だけでは無理な様な?

No.7670

Re:ソートについて(アルゴリズム)
投稿者---TDa(2003/06/22 08:35:11)


>>私なら年号から西暦への変換関数を作ってそれでソートしますね。
>
>昭和は1926年?それとも1989年?
>
>1989年は昭和?それとも平成?
>
>どちらにしても年号だけでは無理な様な?

う、それは考えていなかった。確かに必要十分にはならないかもしれませんね。
でも平成元年も昭和64年もどっちも1989年(なんですよね)にしてしまって
いい場合(月日が付いているなら判定できる)があります。

っていうかそういうデータで年号を使うのは合理的ではないとおもふ。
しかし帳票では年号出さなきゃいけないんですよね。平成から次の年号に
なったときもソフトの変更でどれだけのコストが発生することか、、。

No.7671

Re:ソートについて(アルゴリズム)
投稿者---こん!(2003/06/22 10:10:26)


>でも平成元年も昭和64年もどっちも1989年(なんですよね)にしてしまって
>いい場合(月日が付いているなら判定できる)があります。

そうです。だから

>>どちらにしても年号だけでは無理な様な?

と書きました。
和暦から西暦は年、西暦から和暦は日付まで必要となってしまいます。
そうなるとTDaさんがおっしゃるような変換関数を作るのであれば年まで入れて比
較関数にしてしまった方がいいかもしれない。

ただ今回は年という話はありませんから手法としては、パズル的な発想ではあか
まさんの手法か、或いは正当的(?)にはnoneさんのテーブル値を返す手法が妥
当と感じます。

No.7667

Re:ソートについて(アルゴリズム)
投稿者---こん!(2003/06/22 00:10:33)


>各元号名にシーケンシャルな番号を振り、
>元号名に対応するシーケンシャル番号を返す関数を作成し、
>比較の際にはそのシーケンシャル番号を使用し大小判定を行う。

テーブルもこんだけあればいいかしら?

No.7680

ありがとうございます!!
投稿者---初心者(2003/06/23 10:21:26)


レスくれた方ありがとうございます。
皆さんの方法を参考にもう一度考えてみます!!