1

我正在修改我不久前用 Java 编写的游戏引擎。我有一个包含 Sprite 对象的主 Arraylist。Sprite 类以浮点类型保存指定精灵的 X 和 Y 位置。

我正在尝试根据它们与特定精灵(玩家)的相对距离对列表进行排序。我有一种方法可以计算两个精灵之间的距离。

/**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 个 Sprite)

/**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;
}

就如何做到这一点而言,我通常会陷入困境,而就效率和速度而言,我会展望未来。我有一种测量两个精灵之间距离的方法,现在我只需要对列表进行排序,以便要排序的特定精灵是列表中的第一项,最远的精灵是最后一项。

我曾想过使用递归方法进行排序,或者使用while循环,但我觉得好像有更好的方法。我阅读了有关使用 Comparators 和 Collection 的 sort() 方法的信息。但是我看到的例子是非常基本的。

感谢您的帮助,如果您有任何问题需要回答以更好地帮助我,我将很乐意回答。

编辑:我感觉有人会将这个链接到我,所以我只是澄清一下我知道它,但是很难理解如何使用它来实现我上面指定的内容:

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

4

1 回答 1

3

您需要创建一个Comparator遵循此签名的:

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

如果要在列表中首先排序,则该方法compare应返回正数,否则返回负数。obj1

然后你可以将它传递给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;
}
于 2012-07-22T03:03:11.967 回答