質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

リスト内のオブジェクトと引数を比較し、リストに存在しなければオブジェクトを追加、存在する時は別の処理をする。というプログラムを書いています。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 216

前提・実現したいこと

持っている乗り物をリスト化し、新しく買おうとする乗り物を引数で指定しているとします。
引数で指定した乗り物とコレクション内の乗り物を比較し、リストにそれが存在しなければそのまま追加、存在すれば台数をふやす。というプログラムを組みたいです。

ここに質問の内容を詳しく書いてください。

Personクラスにおいて、find~メソッドを使って引数に指定した乗り物がリストにあるかどうかを判定し、ない場合はnullを返し、ある場合はその乗り物を返すようにしたいです。
Testでリストへの追加等は問題なく行えているのですが、同じ乗り物オブジェクトを作成してもfindメソッドでnullが返ってきてしまうので、その原因、解決法をご教授願いたいです。

該当のソースコード

package vehicles;
import java.util.*;

abstract class Vehicle
{
    private String color;
    private String name;


    public Vehicle(String color,String name)
    {
        if(name == null || color == null)
        {
            throw new IllegalArgumentException();
        }
        this.color = color;
        this.name = name;
    }

    public String getColor()
    {
        return this.color;
    }
    public String getName()
    {
        return this.name;
    }
}
package vehicles;
import java.util.*;

public class Car extends Vehicle
{
    private int number;

    public Car(String color,String name,int number)
    {
        super(color,name);
        this.number = number;
    }

    public int getNumber()
    {
        return this.number;
    }
    public String toString()
    {
        return super.getColor() +""+ super.getName() +""+ this.number;
    }

    public boolean equals(Car car)
    {
        if(car == null)
        {
            return false;
        }
        else if(!(car instanceof Car))
        {
            return false;
        }
        else
        {
            if(this.number == car.getNumber() && this.getName().equals(car.getName()))
            {
                return true;
            }
            return false;
        }
    }
    public int hasCode()
    {
        int hash = 17;
        hash *= 31;
        hash += this.number;
        hash *= 31;
        hash += this.getName().hashCode();
        return hash;
    }
}
package vehicles;

public class Collection
{
    private Vehicle vehicle;
    private int amount = 0;

    public Vehicle getVehicle()
    {
        return this.vehicle;
    }
    public int getAmount()
    {
        return this.amount;
    }

    public void setVehicle(Vehicle vehicle)
    {
        this.vehicle = vehicle;
    }
    public void setAmount(int Amount)
    {
        this.amount += amount;
    }
}
package vehicles;
import java.util.*;

public class Person
{
    List<Collection> collectionList = new ArrayList<Collection>();

    public Collection findCollection(Vehicle vehicle)
    {
        int num = this.collectionList.size();
        if(num == 0)
        {
            return null;
        }
        for(int i = 0; i < num; i ++)
        {
            if(vehicle.equals(this.collectionList.get(i).getVehicle()))
            {
                return collectionList.get(i);
            }
        }
        return null;
    }

    public void addCollection(Collection collection)
    {
        if(this.findCollection(collection.getVehicle()) == null)
        {
            this.collectionList.add(collection);
        }
        else
        {
            this.findCollection(collection.getVehicle()).setAmount(1);
        }
    }
}
package vehicles;
import java.util.*;

class Test
{
    public static void main(String args[])
    {
        Car car1 = new Car("赤","プリウス",1234);
        Car car2 = new Car("茶","タント",1235);
        Car car3 = new Car("青","ヤリス",1054);

        Collection collection1 = new Collection();
        collection1.setVehicle(car1);
        Collection collection2 = new Collection();
        collection2.setVehicle(car2);
        Collection collection3 = new Collection();
        collection3.setVehicle(car3);

        Person person1 = new Person();
        person1.addCollection(collection1);
        person1.addCollection(collection2);
        person1.addCollection(collection3);
        System.out.println(person1.collectionList);

        Car car4 = new Car("赤","プリウス",1234);
        System.out.println(person1.findCollection(car4));→null
        System.out.println(person1.collectionList.get(0).getVehicle());→赤プリウス1234
        System.out.println((Vehicle)car4);→赤プリウス1234    
    }
}        

試したこと

上記のようにSystem.out.printで出力しても同様の内容が出るので困ってしまっています。

補足情報(FW/ツールのバージョンなど)

初学者のため、質問もわかりづらくコードも冗長になってしまい申し訳ございません。
コードをすっきりとさせるためのアドバイス等もいただけると幸いです。
ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

おそらくObject#equalsのオーバーライドに失敗しているのが原因でしょう。
equalsメソッドの引数の型は常にObjectにします。

public class Car extends Vehicle
{
    ...
    @Override    // <= 付けておくと失敗したときエラーがでる
    public boolean equals(Object obj)
    {
        if(obj == null)
        {
            return false;
        }
        else if(!(obj instanceof Car))
        {
            return false;
        }       

        Car car = (Car)obj;
        ...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/17 12:08

    そうだったのですね!ただいま書き換えたところ思い通りの動作をしてくれているようです。ご回答ありがとうございました!また機会がありましたらよろしくお願いいたします。

    キャンセル

+1

ループで見てるだけなので、hashCode関係なかったですね。

以下は、今回の件(equalsでfalseになる)に関しては直接関係ありません。

public int hasCode()

hashCodeの実装ができていません。

@Overrideアノテーションをつけるとスペルミスに気づけます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/17 12:02

    すみません。findで返ってくるのはnullでした。誤字です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • リスト内のオブジェクトと引数を比較し、リストに存在しなければオブジェクトを追加、存在する時は別の処理をする。というプログラムを書いています。