【问题标题】:Sorting an ArrayList of Sprites in Java在 Java 中对 Sprite 的 ArrayList 进行排序
【发布时间】:2012-07-22 02:34:30
【问题描述】:

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

我正在尝试根据它们与特定精灵(玩家)的相对距离对列表进行排序。我有一种方法可以计算 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 以及所有 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

【问题讨论】:

  • 集合必须是 ArrayList 吗?您不能改用某种优先级队列吗?
  • 按照我目前的设置方式,进行修改将非常困难。我将来会研究优先队列,但目前我最容易将其保留为 ArrayList

标签: java sorting collections sprite


【解决方案1】:

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

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

如果obj1 在列表中排在第一位,则方法compare 应该返回一个正数,否则返回一个负数。

然后你可以将它传递给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;
}

【讨论】:

  • 我假设在 compare(...) 方法中返回 0 意味着它们是相同的?
  • 是的,没错。我相信那时sort() 只是选择另一个(任意)键。
  • 好的,非常感谢,除了我认为你犯了一个错误外,它运行良好。如果 s1 更接近 s0,则返回负数。如果 s2 更接近 s0,则返回一个正数。
  • 哦,是的,这很有可能。我永远记不起那个语义。很高兴它成功了。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多