2016-10-14 4 views
0

Planetクラスでブール・メソッドを試して、ヌル・ギャップを閉じるために名前とシフト値で配列を削除する際に問題があります。誰か助けてくれますか?以下は、月と地球のための私のクラスである...配列を名前で削除してヌル・ギャップを閉じるコード

MOON CLASS: -

public class Moon 
{ 
    private float angle=0.01; 
    // add class member variables here 
    private String name; 
    private float radius; 
    private float distance; 
    private float speed; 
    private int orbitalPeriod; 


    // add constructor here 
    public Moon(String name, float radius, float distance, float speed, int orbitalPeriod) 
    { 
    this.name=name; 
    this.radius=radius; 
    this.distance=distance; 
    this.speed=speed; 
    this.orbitalPeriod=orbitalPeriod; 
    } 


    // add other methods here 
    public String getName() 
    { 
    return name; 
    } 

    public void setName(String name) 
    { 
    this.name = name; 
    } 

    public float getRadius() 
    { 
    return radius; 
    } 

    public float getDistance() 
    { 
    return distance; 
    } 

    public float getSpeed() 
    { 
    return speed; 
    } 

    public float getAngle() 
    { 
    return angle; 
    } 

    public int getOrbitalPeriod() 
    { 
    return orbitalPeriod; 
    } 

    public void setOrbitalPeriod(int orbitalPeriod) 
    { 
    this.orbitalPeriod = orbitalPeriod; 
    } 

    public String toString() 
    { 
    return "Moon:"+name+" - (orbit= "+orbitalPeriod+")"; 
    } 

    // This will display the moon when other code is completed. 
    public void display() 
    { 
    angle=angle+(0.01*speed); 
    pushMatrix(); 
    rotate(angle); 
    translate(distance, 0); 
    fill(149, 149, 149); 
    ellipse(0, 0, radius*2, radius*2); 
    popMatrix(); 
    } 
} 

PLANETのCLASS: - 衛星の数が非常に頻繁に変更することができますように

public class Planet 
{ 
    private float angle=0.01; 
    // add class member variables here 
    private float radius, distance, speed; 
    private String name; 
    private Moon [] moons = new Moon [5]; 
    private int numOfMoons = 0; 


    // add constructor here 
    public Planet(String name, float radius, float distance, float speed) 
    { 
    this.name=name; 
    this.radius=radius; 
    this.distance=distance; 
    this.speed=speed; 
    } 

    // add other methods here 
    public String getName() 
    { 
    return name; 
    } 

    public float getRadius() 
    { 
    return radius; 
    } 

    public void setRadius(float radius) 
    { 
    this.radius = radius; 
    } 

    public float getDistance() 
    { 
    return distance; 
    } 

    public float getSpeed() 
    { 
    return speed; 
    } 

    public Moon[] getMoons() 
    { 
    return moons; 
    } 

    public String toString() 
    { 
    return "Planet:"+name+" (r= "+radius+ "d= "+distance+") has "+moons.length+" moon(s)"; 
    } 

public void printMoons() 
{ 
    for (Moon moon : getMoons()) 
    println(moon); 
} 

public void addMoon(Moon moon) 
{ 
    moons[numOfMoons] = moon; 
    ++numOfMoons; 
} 

public boolean removeMoonByName(String moonName) 
{ 
    for (Moon moon : getMoons()) 
    if(moon!=null) 
     moon.removeMoonByName(); 

} 


// This will display the moon when other code is completed. You don't need to understand this code. 
public void display() 
{ 
angle=angle+(0.01*speed); 
pushMatrix(); 
rotate(angle); 
translate(distance, 0); 
fill(255, 255, 255); 
ellipse(0, 0, radius*2, radius*2); 

for (Moon moon : getMoons()) 
    if(moon!=null) 
    moon.display(); 

popMatrix(); 
} 
} 
+0

moon.removeMoonByName();を呼び出す際に何をしようとしましたか?あなたはMoonクラスにその名前のメソッドを渡しませんでした。また、:あなたは要件として配列を使用する必要がありますか? ArrayListを使用すると、作業がはるかに簡単になり、その「閉鎖間隙」全体を心配する必要はありません。 –

+0

ここを見てください - > https://stackoverflow.com/questions/642897/removing-an-element-from-an-array-java#644719 – najjarammar

+0

@ 911DidBushこれは、そのメソッドを動作させようとする私の試みでした。 Arrayの配列を検索して月の名前を探し、特定の月を削除して、プロセスのヌルギャップをクローズしたい。そして、はい、私は配列を使用する必要があります。 –

答えて

1

あなたのコードが見えます、配列はあなたがしたいことのための最良の選択ではないかもしれません。

サイズが柔軟なArrayListの使用を検討してください。ここ は、あなたが何をしたいです:

private ArrayList<Moon> moons = new ArrayList<>(); 

public void addMoon(Moon moon){ 
    moons.add(moon); 
} 

public boolean removeMoonByName(String moonName){ 
    Moon remove; 
    for(Moon m : moons){ 
    if(m.getName().equals(moonName)){ 
     remove = m; 
    } 
    } 
    if(remove != null) return moons.remove(remove); 
    return false; 
} 

注それはあなたが、あなたのリストを反復処理したい月を取得し、後でそれを削除する必要があるので、名前であなたの月を削除した場合、より複雑であること。

1

私は、あなたが明示的に配列を使用して "数学をやる"ことを望んでいると思っています。リストなどで何かを提案するのは無駄です。したがって:

分割統治:

  1. はあなたのMoon[]配列を横断し、フロントにnull以外の項目を移動することで、ヌルギャップを閉じて機能を、書きます。

    もちろん、これを行う方法はたくさんあります。私は単純なコピーを行うと思います: 同じサイズの別の配列をとり、最初の配列からすべてのnull以外のエントリをコピーします。コピーへの参照を設定し、オリジナルをGCに放棄します。

  2. は、月の名前をとる関数を記述し、

    。各月の名前を調べる月配列を横断する。
    b。名前が一致する場合は、 アレイと出口ループのそれぞれのインデックスで参照をクリアしてください(= nullに設定)。
    c。コール関数を1から呼び出します。

追加のヒント:範囲外を参照してください。私は、コメントでは、割り当てが明示的に処理されなければならないと述べていない場合、例外が発生する可能性があることを少なくとも言及したいと思います。

Moon[] removeGaps(Moon[] original){ 
    Moon[] clean = new Moon[original.length]; 
    int i = 0; 
    for (int j = 0; j < original.length; j++){ 
     if(original[j] != null) clean[i++]=original[j]; 
    } 
    return clean; 
} 

名前で月を削除します:それは、最も効率的なソリューションが、非常に単純ではありません

void removeMoon(String name) 
{ 
    // moons is the instance variable Moon[] moons ... 
    for(int i = 0 ; i < moons.length; i++){ 
    // TODO for you: check moon[i] for null (or getName will throw NPE) 
     if (moons[i].getName().equals(name)){ 
      moons[i] = null; // clears the refernce in the array, leaving the object for GC to be collected. 
      moons = removeGaps(moons); 
      break; 
     } 
    } 
} 

はあなたのスターターを得ました。

もちろん、これはすべて、1-linerで可能な、斬新な新しいJava 8の機能で実現できますが、これは学習のためのものです。

+0

提案をありがとう!私は問題を解決するために何をすべきかを知っています。私が使用しようとしたコードには多くのエラーがありました –

+0

これは割り当てなので、私はちょうどコードで答えを与えることを躊躇しています。質問にあなたの最高の試みを加えてください、そして、我々は何が問題であるか見るでしょう。 – Fildor

+0

私は今どこかに行っていると思う、私は持っているものを表示するだろう –

関連する問題