
AとBとCにそれぞれ数値を与えておいて、その数値の大きい順にABCを並べ替えるようにしたいのです。一応、下のようにアルファベットと数値の間にはカンマを入れて分けています。
A, 5-------→B, 9
B, 9-------→C, 7
C, 7-------→A, 5
このように並べ替えたいのですが、うまくいきません。ArrayListを使用しCollectionsクラスのsortメソッドを使ってやれば先頭の文字によるソートはできるのですが、カンマ後の数値での並べ替えの方法がよくわかりません。
いい法方がありましたらおしえてください。
No.4ベストアンサー
- 回答日時:
Harry_さんの回答に賛成ですが、
文字列を格納したArrayListの状態からソートしたいのであれば、
次のようにするといいです。
Collections.sortで、Comparatorを指定しない場合は、
中に入っているオブジェクトのcompareToメソッドを使って、
ソートされます。今回はStringオブジェクトが格納されているので、
StringオブジェクトのcompareToメソッドで比較したソート結果
(文字列を辞書的に並べた結果)でソートされます。
これが、hohumanさんが書いたソースで行っていることです。
今回のように自分独自の比較方法を使用したい場合は、
サンプルのように、自分独自のcompareToメソッドを実装した、
Comparatorを作成して、それをsortするときに使えばいいです。
import java.util.*;
public class Sortable{
private static ArrayList names; // 名前を格納するArrayList
public static void main(String[] args){
names = new ArrayList(); // ArrayListオブジェクトの生成
//ファイルから読み込み
readN();
//自分で作ったComparableを使って、ソート
Collections.sort(names, new MyComparator());
for (int i = 0; i < names.size(); i++){
System.out.println(names.get(i));
}
}
//名前をファイルから読み込んでArrayListに格納(しているふり)
private static void readN(){
names.add("C, 9");
names.add("B, 2");
names.add("A, 7");
}
//カンマ後の数値でソートするComparator
private static class MyComparator implements Comparator{
public int compare(Object obj1, Object obj2) {
//文字列データから、ソート対象となる数値を取得
int num1;
int num2;
String str1 = obj1.toString();
String str2 = obj2.toString();
num1 = Integer.parseInt(str1.substring(str1.indexOf(',') + 1).trim());
num2 = Integer.parseInt(str2.substring(str2.indexOf(',') + 1).trim());
return num2 - num1;
}
}
}
ただし、比較するときに、毎回文字列を解析して、
数値の部分を取り出しているので効率は悪いです。
あと、文字列データの仕様が分からないので、
上記ソースは、カンマの後に数値とスペース以外の文字列があると、
数値部分の取り出しに失敗します。
その辺は、実際のデータに合わせて適切な数値部分のとり方を
実装してください。
これを参考にさせてもらいテキストファイルから読み込んだデータのソートもうまくできました。
私もこれからもっといろいろ勉強していきたいと思いますので、また分からない所がありましたら教えてください。
Harryさん、sasadoraさん お二人とも本当にどうもありがとうございました。
No.3
- 回答日時:
実行例です。
クラス名やインポート文は補ってください。コンパイルはしてません。間違ってたらごめんなさい。
public static void main(String[ ] args) {
Data a = new Data('A', 5) ;
Data b = new Data('B', 9) ;
Data c = new Data('C', 7) ;
List list = Arrays.asList ( new Data[ ]{a, b, c} ) ;
Collections.sort( list ) ;
for ( int i = 0 ; i < list.size() ; i++ ) {
System.out.println( list.get(i) ) ;
}
}
この回答への補足
うーん、こういうやり方もあるのですね。たいへん勉強になります。
どうもありがとうございます。
しかし今の私の場合、そのように自分でソートするものを入れるのではなく、
テキストファイルなどからその内容を一行一行読み込んでいってソートするように
させています。とりあえず、普通にソートできる状態のものを載せておきます。
(Data2.java)
import java.io.*; //入出力
import java.util.*;
class Data2 {
private static ArrayList names; // 名前を格納するArrayList
public static void main(String[] args) {
names = new ArrayList(); // ArrayListオブジェクトの生成
readN(args[0]);
sort();
print();
}
// 名前を ファイルから 読み込んでArrayListに格納
private static void readN(String fileName) {
try {
FileReader aFileReader = new FileReader(fileName);
BufferedReader aInputFile = new BufferedReader(aFileReader);
// ファイルの終わりに到達するまで名前を読み込む
String aLine;
while ((aLine = aInputFile.readLine()) != null) {
names.add(aLine);
//print(); // 名前が追加されていることを確認のための出力
}
aInputFile.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
// 名前の並び替え
private static void sort() {
Collections.sort(names);
}
// 出力
private static void print() {
for (int i = 0; i < names.size(); ++i) {
System.out.println((String)names.get(i));
}
}
}
で、適当なファイル(ABC.txt)を作ってjava Data2 ABC.txtと入力すると
1番前のアルファベット順にソートされます。
(ABC.txt)
C, 9
B, 2
A, 7
↓
A, 7
B, 2
C, 9
この状態でカンマの後の数字でのソートをやろうとしています。
もしわかるようでしたら教えてくださいませんか?よろしくお願いします。
No.2
- 回答日時:
No.1 です。
ちょっと補足です。数字を大きい方から順に並べるのであれば、
下の回答の compareTo メソッドの return 1 と return -1 は
逆にしないといけません。
この回答への補足
回答どうもありがとうございます。
さっそく試してみたのですがコンパイル時にこのようなエラーが発生しました
C:\JAVA\Sort4.java:32: \12288 は不正な文字です。
this.alphabet = alphabet;
^
C:\JAVA\Sort4.java:33: \12288 は不正な文字です。
this.number = number;
^
C:\JAVA\Sort4.java:42: \12288 は不正な文字です。
return alphabet + ", " + number;
^
この場合、何が原因なのか分かりますか?
No.1
- 回答日時:
1レコードのデータをひとつのクラスで表現すべきです。
public class Data {
private char alphabet;
private int number;
public Data(char alphabet, int number) {
this.alphabet = alphabet;
this.number = number;
}
public char getAlphabet() { return alphabet; }
public int getNumber() { return number; }
}
そして、このクラスに Comparable インターフェースをインプリメントさせ、
compareTo メソッドを実装します。
public class Data implements Comparable {
// 上記と同じ
// これを追加
public int compareTo(Object obj) {
Data other = (Data)obj;
if (this.number > other.number) {
return 1;
}
else if (this.number < other.number) {
return -1;
}
else {
return 0;
}
}
そのうえで、このクラスのオブジェクトを格納した List を Collections.sort()
でソートすると、数字の大きさでソートできます。
ついでに toString() も実装しておくとよいですね。
public String toString() {
return alphabet + ", " + number;
}
この回答への補足
>このクラスのオブジェクトを格納した List ・・・
の部分をどのようにすればいいのか、いまいちよくわかりません。
もしよろしければ実行例をお願いできないでしょうか?
まだまだ勉強不足なものですみません・・・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelのソート(並べ替え) 2 2022/05/15 22:54
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Excelグラフのラベルオプションの並べ替えは可能ですか。セルの値を最後にしたいのですが。 1 2022/06/05 10:45
- Excel(エクセル) Googleスプレッドシートの割合の関数と円グラフの並べ替えについて 1 2022/07/22 17:31
- その他(Microsoft Office) エクセル 日付を数値に変換する方法 4 2023/03/24 12:05
- Excel(エクセル) Excelで、行に複数の数字が入力されているセルが複数の列存在し、行を跨いでセル内の数値を並び替える 5 2022/06/17 18:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) エクセルでの色付け 5 2022/10/09 18:58
- Excel(エクセル) Excel 効率的な名簿と得点の管理の仕方 8 2022/08/07 08:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Stringクラスの文字列の内容
-
サーブレットコンテキストの意...
-
オブジェクト、プロパティ、メ...
-
servletからjspへオブジェクト...
-
C++/CLIでの画像情報(RGB)の取得
-
Excel VBA 定数にオブジェクト...
-
データを任意の文字で検索
-
セッション属性
-
VBSのGetFolderメソッドについ...
-
setTimeは、返り値がなぜ不要な...
-
vectorの内容をString型に変換...
-
VBS でのソート処理Excel2003
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
String型からlong型への変換は...
-
エクセルVBA/SpecialCellsで特...
-
「タイプ初期化子が例外をスロ...
-
他クラスのすごくかっこいい同...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
エクセルVBA/SpecialCellsで特...
-
Vba ListViewの行挿入に関して...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
String型からlong型への変換は...
-
VB.NETでのnothing の意義について
-
UTF-8のテキストファイルを開く...
-
javaで、、、
-
System.Collections.SortedList
-
C#でのExcel操作について.(Ran...
-
VBSのGetFolderメソッドについ...
-
JSPでのArrayListの表示につい...
-
ピクチャーボックスに点を打つ...
-
VBAでの[]
おすすめ情報