2012-07-22 54 views
1

我正在摸索出一個我在Java中編寫的遊戲引擎。我有一個擁有Sprite對象的主Arraylist。 Sprite類通過float類型保存指定sprite的X和Y位置。在Java中對Sprites的ArrayList進行排序

我想根據它們與特定精靈(玩家)的相對距離來對列表進行排序。我有一個方法來計算2個精靈之間的距離。

/**Retrieve a double value that represents the distance between 2 sprites*/ 
public static double getSpriteDistance(Sprite s1, Sprite s2) { 
    return Math.hypot((s1.getX() - s2.getX()), (s1.getY() - s2.getY())); 
} 

我有經過了Sprite使用基於其位置,以及所有的子畫面的主列表進行排序(將取決於地圖上的列表上大約500-700精靈)

另一種方法
/**Sort a Sprite list relatively based on a specific sprite's location*/ 
public static ArrayList<Sprite> relativeSort(Sprite s1, ArrayList<Sprite> list) {    
    //Sort 
    return list; 
} 

這就是我通常會被卡住,直到如何做到這一點,並且展望未來的效率和速度。我有一個方法來測量2個精靈之間的距離,現在我只需要對列表進行排序,以便排序的特定精靈是列表中的第一個項目,最遠的精靈是最後一個。

我想過使用遞歸方法來排序,或者一個while循環,但我覺得好像有更好的方法。我閱讀了關於使用Comparators和Collection的sort()方法。但我見過的例子非常基本。

感謝您的幫助,如果您有任何問題需要回答以更好地幫助我,我很樂意回答。

編輯: 我有一種感覺,有人將這個鏈接給我,所以我就澄清,我知道這件事情,但很難理解如何實現上述使用此指定什麼我:

http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

+0

這個集合已經成爲一個ArrayList?你不能使用某種類型的優先級隊列嗎? – 2012-07-22 02:37:13

+0

我現在設置的方式很難做出修改。我將在未來考慮優先級隊列,但目前最容易讓我把它作爲一個ArrayList – DMor 2012-07-22 02:38:23

回答

3

你需要創建跟隨此簽名Comparator

public interface Comparator<Sprite> { 
    public int compare(Sprite obj1, Sprite obj2); 
} 

的方法compare應該返回如果正數10將首先在列表中排序,否則爲負數。

然後你可以將它傳遞到Collections.sort()


您可以創建一個類上,即時這樣很容易地,實際上是:

/**Sort a Sprite list relatively based on a specific sprite's location*/ 
public static ArrayList<Sprite> relativeSort(Sprite s0, ArrayList<Sprite> list) {    

    Comparator<Sprite> comp = new Comparator<Sprite>() { 
     public int compare(Sprite s1, Sprite s2) { 
      //return a positive number if s1 is closer to s0 
      //return a negative number if s2 is closer to s0 
     } 
    }; 
    Collections.sort(list, comp); 
    return list; 
} 
+0

我假設在比較(...)方法中返回0意味着它們是相同的? – DMor 2012-07-22 03:28:06

+0

是的,這是正確的。我相信在那一刻'sort()'只是選擇另一個(任意)鍵。 – 2012-07-22 03:28:45

+0

好的,非常感謝你,除了我認爲你犯的一個錯誤之外,它完美的工作。如果s1更接近於s0,則返回一個負數。如果s2更接近於s0,則返回一個正數。 – DMor 2012-07-22 03:39:40