8日目②(2025.02.07)<オブジェクトの比較>



お疲れ様です!!

今日も復習やっていきます!!
今回は、8日目の続きで「オブジェクトの比較」です!!

ではTim先生!!
よろしくお願いします!!

Tim先生がまずコーディングしたのが、

public class Student implements Comparable<Student>{

というclassのメソッド。
はい、出ました「?」ワード!!
Tim先生が説明してくださんですが、こういう何かのワードの概要とか、深い説明とかになると、
自動翻訳じゃちょっとキツいんですよね、、、
ほんま英語をちゃんと勉強しておけばよかった、、、

このimplementsは、9日目のInterfaceの記事でも触れているんですが、初めて目にして調べたのが、この8日目だったので、ここで調べた結果を書きます。
(時系列が前後して申し訳ないです、、ブログを始めたのが9日目の記事からだったので、、、)

【implementsについて】

(AI先生より)
最初に書いたコードでいうと、
「Comparable<Student>が持っている機能(動作等)を
class studentは、確実に持っています!!」
ということを確約させるための合言葉として、「implements」を入れるとのことです。
ちなみに、Comparableは、比較することを目的としたインターフェースの一種とのことです。
(インターフェースについては、9日目で出てきます)

各クラスで定義したインターフェースを、メインクラスで整理してコーディングができるというメリットがあるようです!!


とういわけで、Tim先生のコーディングを勉強!!


(クラス Student)

public class Student implements Comparable<Student>{
private String name;

public Student(String name){
this.name = name;
}

public boolean equals(Student other){
if(this.name == other.name){
return true;
}
else{
return false;
}
}

public int compareTo(Student other){
return this.name.compareTo(other.name);
}
}



前回と変わった点は、最初のComparableとの連携と、最後のコード追加ですね。
正直、この時点でthis.nameとother.nameの「何」を比べるのか全く分かってませんでした。。。
intって書いてあるので、数字を比べるんだと想像していましたが、
「何の数字!?」
って感じです、、、

まあ進んでいきます。

(メインクラス)

Student アインズ = new Student(“アインズ”);
Student デミウルゴス = new Student(“デミウルゴス”);
Student クライム = new Student(“クライム”);
Student クレマンティーヌ = new Student(“クレマンティーヌ”);

System.out.println(デミウルゴス.compareTo(クライム));



24


おおー!!
ちゃんと処理ができた!!
そして、「24」という謎の数字が出てきた!!



何の数字・・・??
24と聞いたら、高橋由伸さんか桧山進次郎さんしか思い浮かびません。

Tim先生も説明してくださっていたのですが、例のごとく自動翻訳では理解できなかったので、AI先生に聞きました!!

(AI先生より)

JavaにおけるString.compareToメソッドは、2つの文字列を辞書順で比較し、以下ルールに基づいて文字コードの差を返します。

・先頭から1文字ずつ比較していく
・異なる文字が見つかった時点で、その文字コードの差を返す
(例えば、”ア”のUnicode値は、12353、”グ”のUnicode値は、12367なので、”ア”.compareTo(“グ”)は、12353-12367 = -14 を返す)

ただし、String.comareToメソッドの実装では、この差を単純に返すのではなく、何らかの演算処理を行っている可能性があり、Javaのバージョンや、実行環境によって、異なる結果が返される可能性があります。


なるほどなるほど!!
ちなみにUnicodeは、
「世界の様々な言語、書式、記号に、番号を割り当てて定義した標準の文字コード」
とのことです。

次にTim先生は、オブジェクトを画面に出力だけするコードに変えました。

(メインクラス)

Student アインズ = new Student(“アインズ”);
Student デミウルゴス = new Student(“デミウルゴス”);
Student クライム = new Student(“クライム”);
Student クレマンティーヌ = new Student(“クレマンティーヌ”);

System.out.println(クレマンティーヌ);




復習用.Student@279f2327


すると、オブジェクトのフォルダの場所等の情報が羅列した意味不明の文字列が返されました。

この意味不明文字列を人間が読める文字列に変換するのが
toString
というメソッドだそうです。

(class Student)

public String toString(){
return this.name;
}


このtoStringメソッドを追加することで、
「this.nameは、文字列です」
と宣言。

(メインクラス)

System.out.println(クレマンティーヌ);
または、
System.out.println(クレマンティーヌ.toString());


これで、ちゃんと「クレマンティーヌ」と人間が読める文字列で返されました!!

ということで、ちょっと自分でアレンジ!!

★各オブジェクトにレベルを設定し、オブジェクト同士のレベル差を出す。

(class Student)

Class Studentの定義に、
private int level;
を追加

public Studentの定義を
String name,int level
に変更
その下に、
this.level = level;
を追加

public int compare(Student other){
return this.level – other.level;

というメソッドを追加
※ メソッド名は重複したらエラーになるので、compareToの「To」を抜いた



(メインメソッド)
各オブジェクトにレベル情報を入力して、

System.out.println(クレマンティーヌ.compare(アインズ));



-70


おおー!!
できたできた!!

めちゃめちゃ嬉しい!!

というわけで、比較の復習は終了!!

あともう少しで、復習を兼ねた空白の8日間の記事が終わります!!

ではでは!!


コメントを残す