• 締切済み

equalsメソッドの実装

いくつかの本をインスタンスで生成します。この本を4つ生成するときに、3つ目に用意したインスタンスと4つ目に用意したインスタンスの中身が等しい=trueという処理をおこないたいのですが、調べてみた結果、自分でequalsを実装しなくてはならないらしく、その実装ができずにこまっています。equalsメソッドがどんな形になるか、教えていただけないでしょうか? class Book{ String name;//書名 String author;//著者 String publisher;//出版 /*コンストラクタ*/ Book( String name, String author, String publisher, int number){ this.name = name;//書名 this.author = author;//著者 this.publisher = publisher;//出版社 } } class BookShelf{ public static void main(String[] args){ /*インスタンスを作成*/ Book aBook_A = new Book("書名1","Aさん","A出版"); Book aBook_B = new Book("書名2","Bさん","B出版"); Book aBook_C = new Book("書名3","Cさん","C出版"); Book aBook_D = new Book("書名3","Cさん","C出版"); System.out.println(aBook_C.equals(aBook_d));//falseが返される。 } }

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

本格的なアプリケーションのための本格的なクラスなら、equals()メソッドはjava.lang.Objectクラスの: public boolean equals(Object obj) を正しくオーバライドすべきです。それを怠ると、今後このクラスのオブジェクトをCollectionの中で使ったときなどに、期待した結果が得られなくなります。 またequals()メソッドは、objがこのクラスのオブジェクトでない場合と、objがnullの場合を扱っておくのが安全です。

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

1例として、以下のコードを参考にしてみてください。 ------------------------------------------------------------ public class Book { String name;// 書名 String author;// 著者 String publisher;// 出版 int id; /* コンストラクタ */ Book(String name, String author, String publisher, int number) { this.name = name;// 書名 this.author = author;// 著者 this.publisher = publisher;// 出版社 this.id = number; } public boolean equals(Book obj) { if (name.equals(obj.name) && author.equals(obj.author) && publisher.equals(obj.publisher) ) { return true; } return false; } } ------------------------------------------------------------ public class BookShelf { public static void main(String[] args) { /* インスタンスを作成 */ Book aBook_A = new Book("書名1", "Aさん", "A出版", 0); Book aBook_B = new Book("書名2", "Bさん", "B出版", 1); Book aBook_C = new Book("書名3", "Cさん", "C出版", 2); Book aBook_D = new Book("書名3", "Cさん", "C出版", 3); System.out.println(aBook_C.equals(aBook_D)); } }

関連するQ&A

  • NullPointerExceptionがでてしまいます(TT

    Javaを初めて、数日です。 プログラムを作成していたところ、NullpointerExceptionが出てしまい解決策が見つからず前進できません。 よろしければ、お手をお貸しください。よろしくお願いいたします。 class Book { String name;//書名 String author;//著者名 String publisher;//出版社 /*コンストラクタ*/ Book(String name, String author, String publisher) { this.name = name; this.author = author; this.publisher = publisher; } /*文の文字列化*/ public String toString() { return ("書名" + this.name + ",著者名" + this.author + ",出版社" + this.publisher); } } class BookShelf { static Book[] bookShelf;//本棚のデータ構造 ここでは本の配列 static int index = 0;//本が次に入る本棚の位置(配列の添え字) static int i; static int maxsize; /*コンストラクタ*/ BookShelf(int maxsize) { bookShelf = new Book[maxsize]; } /*本棚に本abookを入れる*/ static void add(Book aBook) { bookShelf[index].name = aBook.name; bookShelf[index].author = aBook.author; bookShelf[index].publisher = aBook.publisher; index++; } /*本棚の本の一覧を標準出力に出力する*/ static void show() { for (i = 0; i < maxsize; i++) { System.out.println(bookShelf[i]); } } /*本棚の文字列化*/ public String toString() { return "書名:" + bookShelf[i].name + ",著者名" + bookShelf[i].author + ",出版社:" + bookShelf[i].publisher; } } class TestBookShelf { public static void main(String args[]) { BookShelf bookshlef1 = new BookShelf(2); Book X = new Book("book1", "tanaka", "SIT1"); BookShelf.add(X); Book Y = new Book("book1", "suzuki", "SIT2"); BookShelf.add(Y); BookShelf.show(); } }

    • ベストアンサー
    • Java
  • フィールド名やメソッド名に日本語(漢字)を使う

    Javaだと、フィールド名やメソッド名に日本語を使う事が出来ます。クラス名にも漢字を使えますが、頭文字は大文字アルファベットの習慣がありますので、ここでは置いときましょう。 さて、多くのJavaプログラムでは、フィールドはメソッドに半角アルファベットを使っています。何故でしょうか?欧米人なら分かりますが、日本人は日本語が得意で、日本人プログラマーなら日本語使おうよ。 ///// class T図書 { String タイトル,出版社,著者; int ページ数; java.util.Calendar 発行年月日; T図書(String タイトル,int ページ数,String 著者,String 出版社,java.util.Calendar 発行年月日){ System.out.println("図書を発行したヨーン!"); System.out.println(タイトル+"、"+ページ数+"、"+著者+"、"+出版社+"、"+発行年月日.getTime());} } class H発行{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4); T図書 t00012=new T図書("白い巨塔",567,"山崎豊子","新潮出版社",h1821_11_4); }} ///// class Book{ String title,publisher,author; int pages; java.util.Calendar publish_day; Book(String title,int pages,String author,String publisher,java.util.Calendar publish_day){ System.out.println("図書を発行したヨーン!"); System.out.println(title+"、"+pages+"、"+author+"、"+publisher+"、"+publish_day.getTime());} } class Publish{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4); Book t00012=new Book("白い巨塔",567,"山崎豊子","新潮出版社",h1821_11_4); }} どっちが読みやすいですか?私は前者の方が読みやすいです。後者を好む日本人プログラマーは居ると思いますが、前者を望む日本人は多いと思う。

  • java equalsメソッドについて

    こんにちは。 java初心者ですがandroidを触ることになりました。 不可解なコードで大変恐縮ですが、ご教授願えれば幸いです。 スピナーでセレクトされた文字列と変数(A,B,C,D)の値を比較して条件分岐させたいのですが、 うまくいかず悩んでいます。 下記コード ■■■の部分になります。 1) スピナーに表示される文字列を取得し、変数itemqに代入。 2) 変数A(SONY)と変数itemq(?)を比較し、同じ文字列か比較する。 3) 同一の値であればitemqの値をテキストビューに値をセットする。 というようなものです。 equalsメソッドで比較しているのですが、この部分がどうやら間違っているようなのですが、 原因が全く分かりません。 無知な質問になりますが、どうぞ皆様宜しくお願いいたします。 またコードについての指摘や助言もおねがいします。 public class SampleActivity extends Activity { String path = "/sdcard/PriceSearch/topitems.csv"; static List<String> items = new ArrayList<String>(); static ArrayAdapter<String> adapter; private ListView listview; public String itemq; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Spinner spinner = (Spinner)findViewById(R.id.spinner1); // read csv file readCsvFile(spinner); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) { Spinner spinner = (Spinner)parent; String item = (String)spinner.getSelectedItem(); //トースト表示 Toast.makeText(Price_SearchActivity.this, item, Toast.LENGTH_LONG).show(); itemq = item; listread(); } //Spinnerのドロップダウンアイテムが選択されなかった時 public void onNothingSelected(AdapterView<?> parent) { }}); Button button1 = (Button)findViewById(R.id.btnend); button1.setOnClickListener(new View.OnClickListener() { //@Override public void onClick(View v) { //Activity終了 finish(); return; } }); } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ String A = "SONY"; String B = "TOSHIBA"; String C = "MITSUBISHI"; String D = "FUJITSU"; private void listread() { TextView tv = (TextView)findViewById(R.id.textView2); if (A.equals(itemq) ) { tv.setText(itemq); }else if (B.equals(itemq) ) { tv.setText("itemq"); }else if (C.equals(itemq) ){ tv.setText("itemq"); }else if (D.equals(itemq) ){ tv.setText("itemq"); }else { tv.setText("該当なし"); } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ private void readCsvFile(Spinner spinner) { try { // create reader InputStream input = new FileInputStream(path); InputStreamReader ireader=new InputStreamReader(input, "UTF-8"); CSVReader reader = new CSVReader(ireader,',','"',0); String[] csv; //スピナー用 ArrayAdapterを作成 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner); while ((csv = reader.readNext()) != null) { //ドロップダウンアイテムの追加 adapter.add(csv[0]); } //スピナーにadapterを設定 spinner.setAdapter(adapter); reader.close(); ireader.close(); input.close(); } catch (FileNotFoundException e) { Log.e("ERROR", e.toString()); } catch (UnsupportedEncodingException e) { Log.e("ERROR", e.toString()); } catch (IOException e) { Log.e("ERROR", e.toString()); } } }

    • ベストアンサー
    • Java
  • 問題の意味が分かりません

    javaの勉強をしているのですが問題の意味が分からないため 問題を解けません。 ”私の疑問点は「」を使って表していきます。” 問題文 メインメソッド (1) Lendmanagerクラスのインスタンスlendmanagerを作成する 以下endが入力されるまで(1)~(6)を繰り返す。(実行時は6冊分入力する) 「mainの処理が開始されるときに強制的に(最低でも)6冊分は入力すると言う意味でしょうか」 (2) キーボードから書名、作者名を入力 (3) Bookクラスのインスタンスbookを作成する (4) setTitle()メソッドでタイトルを設定する (5) setAuthor()メソッドで著者名を入力 (6) Lendmanagerクラスのaddメソッドでこの本を追加する(Lendmanagerに本を登録する) (7) 登録終了後Lendmanagerクラスのshow()メソッドで登録された本の書名、作者名を表示 ---------------------------------------------------------------- Lendmanagerクラスでは (1) コンストラクタでBook型の配列aBookを要素5で確保 (2)iLengthに初期値0を設定。(aBookの要素数) (3)add()メソッドでiLengthが5を超えていたら、これ以上追加できませんと言うメッセージを表示「mainメソッドで最初に6冊分入力しているのに要素数が足りなすぎます。main()メソッドのendが入力されるまでと言うのは何の意味があるのでしょう」 (4)iLengthが5を超えていなかったら配列aBookにBook型のオブジェクトbook を追加しiLengthに1を加える (5)show()メソッドではaBookの全ての要素について本の書名、作者名を表示 --------------------------------------------------------------- UML図 Book --------- -title:String -author:String ------------ +setTitle(title:string):void +setAuthor(author:string):void +show():void --------------- Lendmanager -------------- -aBook:Book[] -iLength:int -------------- +Lendmanager() +add(book:Book):void +show():void 以上ですよろしくお願いします。

    • ベストアンサー
    • Java
  • singletonによるインターフェイスの実装

    Java勉強中の初心者です。 標題の件についてお願いします。 以下、簡単に条件を説明させていただきます。 Aクラス = メインクラス Bクラス = インターフェイスクラス Cクラス = DとEを動的に生成するクラス Dクラス = インターフェイスを実装するクラス Eクラス = インターフェイスを実装するクラス AクラスにB.getInstance(name)があります。 for文の無限ループがあります。 Cクラス class C { public static B getInstance(String name) { // Aクラスのaと変数nameが比較して一致したら // Dクラスのインスタンス生成 // 一致しなかったらEクラスのインスタンス生成 if(A.a.equals(name)){ return D.getInstance(); }else{ return E.getInstance(); } } } Dクラス class D implements B{ private D() { } public static D getInstance() { D d = new D(); return d; } // インターフェイスでのメソッド省略します。 } Eクラス class E implements B{ private E() { } public static E getInstance() { E e = new E(); return e; } // インターフェイスでのメソッド省略します。 } この条件の時にnewするたびにインスタンスが 生成されてしまいます。 インスタンスの生成が一度だけしか 生成されないようにするには、C,D,Eクラスで どのように記述すればいいか悩んでいます。 (骨組みは書けましたが) クラスを簡単に省略してわかりづらいと 思いますがよろしくお願いします。

    • ベストアンサー
    • Java
  • equals()について

    public class Test1 { public static void main(String[] args) { Long A = new Long(7); Long L = new Long(7); if(A.equals(L))System.out.println("Equal"); else System.out.println("Not Equal"); } } のようなプログラムではAとLは別で宣言されるため "別オブジェクト”に成ると思い込んでいました。 しかし結果はequalでした・・・ たとえばABCというクラスがあったとして、 ABC c = new ABC(); ABC d = new ABC(); ABC e = c; とすれば、 c、dはnot equal で c,eはequal に成りますよね。 これはすごくわかるんです。 で、なぜ上のプログラムでAとLがequalになってしまうのかわかりません・・・・ 誰か教えてください・・・

    • ベストアンサー
    • Java
  • Equalsはどこから呼出してるのでしょうか?

    wpfの次のpublic override int GetHashCode()とpublic override bool Equals(object obj)とpublic override string ToString()にブレークポイントを設定し「開始」をすると起動時にEqualsで中断、コンボボックスをクリックするとToStringやGetHashCodeで中断しますが、これらの呼び出し元はどこなのでしょうか? 何卒、ご教授よろしくお願いします。 mainwindow.xaml <Grid> <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="200,138,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{x:Static local:classA.comblist}"/> </Grid> mainwindow.xaml.cs public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } class classA { public static classB[] comblist { get { classB[] List = new classB[3]; classB a1 = new classB(); a1.listb = "AAA"; List[0] = a1; classB a2 = new classB(); a2.listb = "BBB"; List[1] = a2; classB a3 = new classB(); a3.listb = "CCC"; List[2] = a3; return List; } } } class classB { private string _listb; public string listb { get { return _listb; } set { _listb = value; } } public override int GetHashCode() { return 1; } public override bool Equals(object obj) { return false; } public override string ToString() { return listb; } } ※長々と書き込みすいません、コード自体に意味はございません

  • あるclassのオブジェクトをVectorで作るには

    以下のプログラムのようにあるクラスを定義してそのクラスの オブジェクトを配列として作成する方法は知ってるんですが、 Vectorとして作成するにはどうしたらいいですか? public class Test {  public static void main(String[] args) {   Book book[] = Book[5];   book[0] = new Book("English");  } } class Book{  String name;  Book(String name){   this.name = name; } }

    • ベストアンサー
    • Java
  • Undo/Redo機能の実装

    swingで作っているブラウザーに進むと 戻るの機能を実装したいのですが、 なかなかブラウザーにこの機能をつけたサンプルが みつからなくて、どなたか教えていただけないでしょうか? RedoAction redoAction = new RedoAction(); UndoAction undoAction = new UndoAction(); mn2.add(redoAction); mn2.add(undoAction); class RedoAction extends AbstractAction{ RedoAction(){ putValue(NAME, "進む"); } public void actionPerformed(ActionEvent e){ } } class UndoAction extends AbstractAction{ UndoAction(){ putValue(NAME, "戻る"); } public void addDocument(String text, String type, String title) { //JEditorPane html = new JEditorPane(type , text); html.setEditable(false); html.addHyperlinkListener(this); JScrollPane pane = new JScrollPane(html); tabPane.addTab(title, null , pane); } public void addDocument(URL url) { html.setContentType("text/html "); html.setEditable(false); html.addHyperlinkListener(this); try { html.setPage(url); } catch(Exception err) { } JScrollPane pane = new JScrollPane(html); tabPane.addTab(url.toString() , null , pane); }

  • 初心者なのですが、困ってます。

    下記のプログラムのString getAuthors()で「authorsの配列に格納された著者名をnum分繋げてconnectへ格納(著者名が2人以上の場合は著者名の間をスラッシュ(/)で区切る)」としたいのですがどう書けばよいのかわかりません。どなたか教えてもらえないでしょうか? import java.util.*; public class javaprog { public static void main(String[] args) { /* Bookクラスからインスタンスを生成 */ Book myBook = new Book("The Java Tutorial", 55, 1999); System.out.println("My book title = " + myBook.getTitle()); System.out.println("My book title = " + myBook.title); System.out.println("My book price = $" + myBook.getPrice()); System.out.println("My book Yenprice = ¥" + myBook.getYenPrice()); System.out.println("My book year = " + myBook.getYear()); /* Bookクラスからインスタンスを生成 */ Book yourBook = new Book("The Java Programming Language", 40, 1998); System.out.println("Your book title = " + yourBook.getTitle()); System.out.println("Your book price = $" + yourBook.getPrice()); System.out.println("Your book Yenprice = ¥" + yourBook.getYenPrice()); Vector names = new Vector(); // コレクションクラスVectorのインスタンスの生成 names.add(new String("Y.K")); names.add(new String("A.S")); names.add(new String("T.H")); Book theirBook = new Book("Java Book", 30, 2000); theirBook.setAuthors(names); theirBook.getAuthorsNum(); } } class Book { // クラスBookの宣言 String title; // 題名 private int price; // 価格(ドル) private int year; // 出版年(西暦) String[] authors = new String[10]; // 複数の著者の名前を保持する int num; // 著者数を管理する変数 Book(String t, int p, int y) { // コンストラクタ title = t; // 題名の設定 price = p; // 価格の設定 year = y; // 出版年の設定 } public String getTitle() { // 題名の取得 return title; } public int getPrice() { // 価格の取得 return price; } public double getYenPrice() { // 円での価格の取得 double yenPrice = price * 111.58; return yenPrice; } public int getYear() { // 出版年の取得 return year; } void setAuthors(Vector names) { // 著者名を設定する関数 Iterator it = names.iterator(); while(it.hasNext()) { String authors = (String)it.next(); } // numに著者数を格納 num = names.size(); } int getAuthorsNum() { // 著者の数を取得するメソッド return num; // numを返す } String getAuthors() { // 著者名を"/"で区切った文字列を格納する変数を宣言 String connect; //authorsの配列に格納された著者名をnum分繋げてconnectへ格納 for(int i = 0; i < num; i++) { } } }

    • ベストアンサー
    • Java

専門家に質問してみよう