Звездообразная реализация в Java

#java #a-star

#java #a-star

Вопрос:

Итак, в настоящее время у меня возникли проблемы с завершающими штрихами моего поиска пути A *, у меня есть все необходимые вспомогательные функции для этого, и я фактически реализовал этот алгоритм как в Javascript, так и в ActionScript, однако я спотыкаюсь об использовании списков в Java.

В ней нет ошибок, но мне нужно внести последние штрихи, чтобы я мог протестировать, чтобы убедиться, что она функционирует должным образом.

Что мне нужно сделать, так это отсортировать openList, чтобы я мог получить узел с наименьшей стоимостью, вот где мне нужна помощь.

Вот что у меня есть:

 public class Pathfinding
{
    List<Node> closedList = new ArrayList<Node>();
    List<Node> openList = new ArrayList<Node>();

public Node calculateShortestDistance(List<Integer> tiles, Node start, Node goal, List<Integer> passableTiles)
{

    Node currentNode = new Node(start.row, start.col, start.gCost, start.fCost, null);

    while(!catchMeIfYouCan(currentNode, goal))
    {
        int row = currentNode.row;
        int col = currentNode.col   1;

        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //left child
        col -= 2;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //top child
        col  ;
        row--;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //bottom child
        row  = 2;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //bottom right
        col  ;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //bottom left
        col -= 2;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //top left
        row -= 2;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //top right
        col  = 2;
        addChild(row, col, tiles, passableTiles, currentNode, goal, openList, closedList);

        //Put currentNode in the closedList
        closedList.add(currentNode);
        //Sort the openList

        //Assign currentNode to the last element in the List

    }
    return currentNode;
}
  

Комментарии:

1. В чем вопрос?

2. Сортировка, я думаю? Я отвечаю на это…

3. Вы правы, Анубиан, извините, если это не так понятно. Я отредактировал его в надежде, что это сделает его немного понятнее для зрителей.

4. Кроме того, предоставленный вами код не является точным или не соответствует теме…

5. Как код не точен и не соответствует теме? Мне жаль, что вы так считаете, однако это соответствующий раздел кода, в котором у меня возникла проблема.

Ответ №1:

Сортировка списка довольно проста. Во-первых, вам нужно сделать узел сопоставимым:

 class Node implements Comparable<Node>
  

Затем вам нужно написать:

 public boolean compareTo(Node other)
  

Это должно быть проверкой на равенство.

Затем вы можете легко использовать Collections.sort() :

 Collections.sort(openList);