2

Carの親クラスから1つのパラメーターを取得し、それを配列()に追加しようとしていますcarsParkedが、どうすればよいですか?

親クラス

public class Car
{
    protected String regNo;       //Car registration number
    protected String owner;       //Name of the owner
    protected String carColor;

    /** Creates a Car object
     * @param rNo - registration number
     * @param own - name of the owner
     **/
    public Car (String rNo, String own, String carColour)
    {
        regNo = rNo;
        owner = own;
        carColor = carColour;
    }

    /** @return The car registration number
     **/
    public String getRegNo()
    {
        return regNo;
    }

    /** @return A String representation of the car details
     **/
    public String getAsString()
    {
        return "Car: " + regNo  + "\nColor: " + carColor;

    }
    public String getColor()
    {
        return carColor;
    }
}

チャイルドクラス

public class Carpark extends Car
{
    private String location;        // Location of the Car Park  
    private int capacity;           // Capacity of the Car Park - how many cars it can hold 
    private int carsIn;             // Number of cars currently in the Car Park   
    private String[] carsParked;

    /** Constructor for Carparks
     * @param loc - the Location of the Carpark
     * @param cap - the Capacity of the Carpark
     */
    public Carpark (String locations, int room)
    {

        location = locations;
        capacity = room;
    }
    /** Records entry of a car into the car park */
    public void driveIn()
    {
         carsIn = carsIn + 1;



    }

    /** Records the departure of a car from the car park */
    public void driveOut()
    {
        carsIn = carsIn - 1;
    }

    /** Returns a String representation of information about the carpark */
    public String getAsString()
    {
        return location + "\nCapacity: " + capacity +
             "  Currently parked:  " + carsIn + 
             "\n*************************\n";
    }

}

最後の質問方法

public String getCarsByColor(String carColour)

{{

  for (int num = 0; num < carsParked.length; num++)
    {
        if ( carColour.equals(carsParked[num]) )
        {
            System.out.print (carsParked[num]);
        }
    }
return carColour;

}

これまでのところ、パラメータに「赤」を入力すると、すべての車が赤で表示され、対応する情報が表示されますが、機能しないようです〜_〜。

4

2 に答える 2

7

ここでは間違った関係にあるようです。駐車場は車ではありません。これらのクラス間でどちらの方向にも継承を使用しないことをお勧めします。そしてCarpark、おそらく車の配列またはコレクションを持っている必要があります。

また、パラメータは必要ないことに注意してください。車の配列をcarsIn取得するだけです(または、の場合は)。lengthsize()Collection

編集:driveInさて、継承の部分を無視すると、呼び出されたときに車を追加し、呼び出されたときに車を削除するのが理にかなっているようdriveOutです。

driveInおそらく引数としてaを取る必要がCarあります。そうすれば、メソッドは保存したいパラメーターにアクセスできます(個人的にはCar参照を保存するだけですが、問題ありません)。これらのパラメータを追加および削除するのでList、のような配列の代わりに、それ自体のサイズを変更できるを使用する方がはるかに簡単ArrayListです。例えば:

private final List<String> carsRegNosParked = new ArrayList<String>();

public void driveIn(Car car) {
    carsRegNosParked.add(car.getRegNo());
}

何をすべきかはあまり明確でdriveOutはありません。削除するには、特定の登録番号が必要になる場合があります。

public void driveOut(String regNo) {
    carsRegNosParked.remove(regNo);
}

または、最初の車が追加されたと言うと、無差別に車を削除する可能性があります。

public void driveOut() {
    if (!carsRegNosParked.isEmpty()) {
        carsRegNosParked.remove(0);
    }
}

との違いに注意してremove(Object)くださいremove(int)

于 2012-11-08T05:00:56.817 に答える
0

最初carsParkedにリストに変更します。それで:

private String[] carsParked;

になります

private List<String> carsParked;

次に、コンストラクターで次のようにして空のリストに初期化します。carsParked= new ArrayList();

次に、ドライブインメソッドで、車のパラメーターを取得し、必要なパラメーターをプルします。

public void driveIn(Car car) {
   carsParked.add(car.getRegNo());
}

また、この方法で車の数を追跡する必要はありません。あなたはいつでもcarsParked.size()見つけるためにできるので。


今、私はおそらくそのリストをList<Car>文字列の代わりに変更し、そこに車全体をダンプするでしょう。確かに、現在必要なアイテムは1つだけかもしれませんが、将来的には誰かが必要になるかもしれません。

編集: 確かにあなたは単純な配列でそれを行うことができます。それに関する問題はサイジングです。最初にサイズ5の配列を作成するとします。6つのアイテムを追加するときは、新しいより大きな配列を作成し、元のデータをコピーしてから、新しいアイテムを追加する必要があります。ただもっと仕事。ここで、駐車場があり、X個のスポットを配置できるというアイデアの場合は、最初からそのサイズにアレイを初期化します。

public Carpark (String locations, int room){
    location = locations;
    capacity = room;
    //this creates an array with the max number of spots
    carsParked = new String[capacity];
    //also good idea to init 
    carsIn = 0; //initial number of cars parked
}

次に、あなたのdriveIn()方法で:

public void driveIn(Car car) {
   carsParked[carsIn] =car.getRegNo();
   carsIn=carsIn+1;
}

driveOut()

public void driveOut(Car car) {
   //loop through the array until we find the car
   for (int i=0; i < carsParked.length; i=i+1){
     if (car.getRegNo().equals(carsParked[i])){
        //we found the car, so set the space null
        carsParked[i] = null;
        carsIn=carsIn-1;
        //stop looping now
        break;
     }
   }
}

よさそうですね。いいえ、そうではありません。driveInヌルスポットがいたるところに散らばっているので、これでは機能しません。どうすれば修正できますか:

public void driveIn(Car car) {
   //loop through the array until we find a null spot, 
   //then park the car
   for (int i=0; i < carsParked.length; i=i+1){
     if (carsParked[i] == null){
        //we found the car, so set the space null
        carsParked[i] = car.getRegNo();
        carsIn=carsIn+1;
        //stop looping now
        break;
     }
   }
}

それでもさらに改善される可能性があります。情報を捨てないように変えString[] carsParkedたいと思います。また、ブール値を返すようにメソッドとメソッドをCar[] carsParked変更して、車が正常に駐車されたか、駐車されていないかを示します。driveIndriveOut

最終編集: わかりました。駐車場に駐車されている車とその場所を追跡したい場合は、各車について十分に理解して、車をユニークにする必要があります。あなたの場合、あなたは必要なだけかもしれませんregNo。したがって、電話をかけるとき、driveInまたはdriveOutその情報を渡す必要がある場合は、配列内の適切なインデックス(駐車スポット)に情報を保存できます。そうでなければ、あなたが知っているのは、車がどこかに駐車されたか、車が去ったことだけです。どのスポットが開いているかではありません。

つまり、Car carこれら2つの方法のパラメーターには、駐車中または出発中の各車を一意に識別するために必要な情報が含まれています。それがなければ、駐車場インスタンスには、現在駐車されている人や、駐車されている場所の手がかりがありません。

于 2012-11-08T04:59:46.910 に答える