dポイントプレゼントキャンペーン実施中!

Javaでクイックソートを使って、アルファベットを昇順に(スペースより小文字の方が大きい、小文字より大文字のほうが大きいものとする)並べ替えたいのですが、比較方法がよくわかりません。ご教授お願いいたします。
入力は、キーボードからの入力でchar型配列です。

A 回答 (5件)

//#3を若干修正したバージョン for JAVA 1.5


import java.util.Arrays;
import java.util.Comparator;
//import java.lang.Character;

//[A-Z]は[a-z]より大きい
class MyCharSort implements Comparator<Character> {

public static void main(String args[]){
char inpData[] = {'A','b','z','Q',' ','R','Z','H','A'};
Character data[] = new Character[inpData.length];
for(int i=0;i<inpData.length;i++){
data[i]=new Character(inpData[i]);
}
Comparator<Character> cmp=new MyCharSort();

Arrays.sort(data, cmp);
for(Character c : data){
System.out.println(c.charValue());
}
}
public int compare (Character ch1, Character ch2) {
char c1=ch1.charValue(), c2=ch2.charValue();
if(Character.isUpperCase(c1) && Character.isLowerCase(c2))
return ( 1);
if(Character.isLowerCase(c1) && Character.isUpperCase(c2))
return (-1);
return (ch1.compareTo(ch2));
}
}
    • good
    • 0
この回答へのお礼

とても丁寧なご回答ありがとうございます。
早速、参考にさせていただきます。

お礼日時:2005/05/06 12:39

1.


charは整数型ですので、大小が比較できます。
例:
char a = 'a';
char b = 'b';
System.out.println("a:"+(int)a+",b:"+(int)b);
とすると分かるかと思います。

2.
次に大文字、小文字の判定ですが…
1.を応用すれば比較できます。
[a-z],[A-Z]の整数値を出力してみれば、大文字と小文字の範囲が分かるので、
小文字の最小値以上かつ小文字の最大値以下なら小文字
大文字の最小値以上かつ大文字の最大値以下なら大文字

1.と2.を組み合わせれば比べる2つの文字が大文字か小文字を判定して、さらに大文字内での大小比較、小文字内での大小比較をすればいいと思います。

もし、クイックソートのアルゴリズムについて知りたければ、検索すれば沢山ひっかかるでしょうし、javaのサンプル(demoの下)にもQSortAlgorithm.javaというクラスがあるので、参考にしてみるのもいいかもしれません。
    • good
    • 0
この回答へのお礼

わかりやすいご回答ありがとうございます。

お礼日時:2005/05/06 12:41

[A-Z]は[a-z]より大きい、というのを踏まえて、ソートする部分を作るのはイヤなので、比較関数だけ作ってArrays.sortを利用しようとするサンプル。


メソッド compare の部分がほぼ#1で説明していることそのまま。
この場合のソートはマージソート(なので質問文の要求とは異なる)
#2の説明Array.sortはArrays.sortの間違い
どうも、望んでいるモノと違うという場合には、
質問者の作成したソースを補足で挙げて下さい。
私自身、java は、勉強中なので、変なソースかもしれないことをおことわりしておきます。
------8<-------8<--------8<--------
import java.util.Arrays;
import java.util.Comparator;
//import java.lang.Character;

//[A-Z]は[a-z]より大きい
class MyCharSort implements Comparator {

public static void main(String args[]){
char inpData[] = {'A','b','z','Q',' ','R','Z','H','A'};
Character data[] = new Character[inpData.length];
for(int i=0;i<inpData.length;i++){
data[i]=new Character(inpData[i]);
}
Comparator cmp=new MyCharSort();

Arrays.sort(data, cmp);
for(Character c : data){
System.out.println(c.charValue());
}
}
public int compare (Object o1, Object o2) {
Character ch1=(Character)o1, ch2=(Character)o2;
char c1=ch1.charValue(), c2=ch2.charValue();
if(Character.isUpperCase(c1) && Character.isLowerCase(c2))
return ( 1);
if(Character.isLowerCase(c1) && Character.isUpperCase(c2))
return (-1);
return (ch1.compareTo(ch2));
}
}
    • good
    • 0

キーボードからの入力は、char data[]に入っているとして入力部分は省略した。


普通にArray.sort(クイックソート)を使用するサンプル
------8<--------8<-------8<-----------
import java.util.Arrays;

class CharSort {

public static void main(String args[]){
char data[] = {'A','b','z','Q',' ','R','Z','H','A'};

Arrays.sort(data);
for(char c : data){
System.out.println(c);
}
}

}
    • good
    • 0

単純にソートするだけなら、java.util.Arraysのsortでできますが、


「小文字より大文字のほうが大きいものとする」と言うところが普通とは違うので自作しなければならないということでしょうね。
2つのchar型を比較するメソッド(関数)で、まず、種類(大文字か小文字か)で比較が決まればその結果を返し、種類が同じなら単に大小比較をすればいいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!