2016-10-14 28 views
0

我在嘗試在我的Planet類中創建一個布爾方法以按名稱刪除數組並移動值以關閉任何空缺口時出現問題。任何人都可以提供幫助嗎?下面是我的班月球與地球...通過名稱刪除數組並刪除任何空缺的代碼

MOON類: -

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類: -

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()時,你想做什麼?你沒有給你的月球班上一個名字的方法。另外:你是否需要使用數組作爲要求?使用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[]陣列,並通過移動非空條目前關閉空差距。

    當然,有很多方法可以做到這一點。我想我會做一個簡單的副本: 取另一個相同大小的數組,然後複製第一個數組中的所有非空條目。然後將參考設置爲副本並將原件放棄到GC。

  2. 編寫一個函數,需要一個月亮的名字,

    一個。穿過月球陣列仰望每個月亮的名字。 b。如果名稱匹配,則清除 數組中相應索引處的引用(=設置爲空)並退出循環。
    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; 
     } 
    } 
} 

這不是最有效的解決方案,但很簡單。

當然,您可以使用花哨的新Java 8功能完成所有這些工作,但可能需要單線程......但這是爲了學習。

+0

感謝您的建議!我知道我應該做什麼,我有問題的代碼。我嘗試使用的代碼有很多錯誤 –

+0

由於這是一個任務,我只是猶豫是否給出了一個代碼的答案。爲問題添加最佳嘗試,我們會看到問題所在。 – Fildor

+0

我想我現在正在某個地方,我會顯示我有什麼 –