gpt4 book ai didi

java - 查找两种数据类型的第 n 个最接近的对象

转载 作者:行者123 更新时间:2023-12-02 12:21:30 24 4
gpt4 key购买 nike

我正在尝试找到距离玩家第 n 个最近的对象,并环顾四周并得出结论:2D ArrayList 或 List 似乎是我需要存储对象 ID 及其与玩家的距离,然后按升序对其进行排序。但是我不确定如何用列表来实现这一点。我目前确实有工作代码来查找最近的对象,但在不使用大量变量的情况下查找第 n 个对象似乎要困难得多。

下面的这个问题是我见过的最接近的答案 - 但是它们使用两个字符串,而不是我需要的两个不同的值,例如对象和 int。

How to Sort 2D ArrayList<String> by Only the First Element

List<ArrayList<GameObject>> nearest = new ArrayList<ArrayList<GameObject>>();

nearest.add(new ArrayList<GameObject>(Arrays.asList(instance, int))); //Adds a new instance and it's distance to the player.

目前我收到一个错误,数组中不允许同时存在对象和 int,而且我似乎无法为这两种类型定义它。

最佳答案

假设您有一个 GameObject 的集合(Set、List,等等):

Collection<GameObject> gameObjects = ...;

在某个地方,您还有一种方法用于计算一个游戏对象到玩家的距离。我假设它返回一个 int:

public int computeDistanceToPlayer(GameObject gameObject) {
...
}

您想要根据这些游戏对象到玩家的距离对它们进行排序,以获得第 n 个更近的对象。最简单的方法就是对对象进行排序。例如:

List<GameObject> sortedGameObjects = 
gameObjects.stream()
.sorted(Comparator.comparingInt(gameObject -> computeDistanceToPlayer(gameObject)))
.collect(Collectors.toList());

然后您可以从该列表中获取第 n 个元素。

您甚至可以直接从流中获取第 n 个元素:

GameObject nthCloserGameObject = 
gameObjects.stream()
.sorted(Comparator.comparingInt(gameObject -> computeDistanceToPlayer(gameObject)))
.skip(n - 1)
.findFirst()
.orElse(null);

这就是您所需要的,但是,如果距离计算成本高昂(需要长时间且成本高昂的计算),那么它并不是真正的最佳选择,因为它多次计算同一游戏对象的距离:每次与另一个游戏对象进行比较在分拣过程中。因此,如果您想避免这种情况,您可以先计算所有距离并将它们与游戏对象关联,然后对结果进行排序:

public class GameObjectWithDistance {
private final GameObject gameObject;
private final int distance;

// constructor, getters omitted for brevity
}

现在您只需将每个 GameObject 包装在 GameObjectWithDistance 中,并对结果进行排序:

GameObject nthCloserGameObject = 
gameObjects.stream()
.map(gameObject -> new GameObjectWithDistance(gameObject, computeDistanceToPlayer(gameObject)))
.sorted(Comparator.comparingInt(GameObjectWithDistance::getDistance))
.skip(n - 1)
.findFirst()
.map(GameObjectWithDistance::getGameObject)
.orElse(null);

现在,如果您不熟悉流和 lambda,您可以使用循环、列表和比较器类来做到这一点,这并不重要。重要的是逻辑,以及认识到您不需要任何类似的 2D 列表。

关于java - 查找两种数据类型的第 n 个最接近的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com