【问题标题】:Convert 2d array to a graph with nodes and edges将二维数组转换为具有节点和边的图
【发布时间】:2021-07-21 10:46:09
【问题描述】:

我的问题是,对于我的 pacman 板创建,我使用一维数组,但我想对幽灵实现 BFS 算法,据我了解,除非我有一个带有节点和边的图,否则我无法执行该算法。 ..所以在我的代码中,我试图将新创建的二维数组转换为哈希映射,并为键(节点)使用迭代器,并且该节点包含“值”,它是板上的特定索引。我希望我走在正确的轨道上,但我正在为此苦苦挣扎。

package pacman;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Collectors;

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.DefaultUndirectedGraph;
import org.jgrapht.graph.SimpleWeightedGraph;

/**
 * This class is used to create a graph from a 2d array
 * 
 * @author Kody Berry
 *
 */
public class GraphCreation {
    private final static short levelData[] = { 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, 17, 16, 16, 16, 16,
            24, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 28, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0,
            0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 19, 18, 18, 18, 18, 18, 16, 16, 16, 16, 24, 24, 24, 24, 20, 17,
            16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21,
            17, 16, 16, 16, 24, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 18, 18, 18,
            18, 20, 17, 24, 24, 28, 0, 25, 24, 24, 16, 16, 16, 16, 16, 16, 20, 21, 0, 0, 0, 0, 0, 0, 0, 17, 16, 16, 16,
            16, 16, 20, 17, 18, 18, 22, 0, 19, 18, 18, 16, 16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16,
            16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 26, 24,
            24, 24, 24, 24, 24, 24, 24, 24, 28 };

    public static Graph<Integer, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<Integer, DefaultEdge>(
            DefaultEdge.class);

    public static Graph<Integer, DefaultEdge> createGraph(int[][] s) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        int k = 1;
        // Getting an iterator
        Iterator<?> mapIterator = map.entrySet().iterator();

        // Adding values to hash map
        for (int i = 0; i < s.length; i++) {
            for (int j = 0; j < s[i].length; j++) {
                if (s[i][j] == 16) {
                    map.put(k, s[i][j]);
                    k++;
                }
            }
        }

        while (mapIterator.hasNext()) {
            Map.Entry mapElement = (Map.Entry)mapIterator.next();
            int t = (int) mapElement.getKey();
            
            undirectedGraph.addVertex(t);
            
        }
        
        return undirectedGraph;
    }

    /**
     * Method used to convert the 1d array game board to a 2d array board
     * 
     * @param s
     * @return
     */
    public static int[][] oneDtoTwoDConverter(short[] s) {

        int array2d[][] = new int[15][15];


        for(int i=0; i<15;i++)
           for(int j=0;j<15;j++)
               array2d[i][j] = s[(j*15) + i]; 

        return array2d;// Returns new 2d array.
    }
    
    // Test output
    public static void main(String[] args) {
        int[][] s = oneDtoTwoDConverter(levelData);
        System.out.println(createGraph(s));
    }
}

我目前的输出如下。

([], [])

我也在使用 JGraphT 库。我还没有弄清楚如何创建边缘,所以如果您对此有任何建议,我将不胜感激。

PS。如果您对如何执行此操作有更好的想法,请告诉我!谢谢你:)

【问题讨论】:

    标签: java arrays graph hashmap breadth-first-search


    【解决方案1】:

    可能还有更多问题,但对我来说最明显的是,您在填充地图之前创建了迭代器。当您对其进行迭代时,它会在填充之前为您提供内容,因此它是空的。

    如果您将 Iterator&lt;?&gt; mapIterator = map.entrySet().iterator(); 移到循环下方,应该会发生更多事情。

    但是对“s[i][j] == 16”的检查对我来说也有点可疑,但我还没有仔细考虑,但不知何故我希望你的地图看起来像 {1:16 , 2: 16, 3: 16, ...} 用python术语来写。

    【讨论】:

    • 16 是 pacman 吃的颗粒的位置。吃完之后那个方格的值变成了15,你觉得我应该把索引位置作为地图的值吗?
    • 关键是现在你有一个非常复杂的方法来计算 16s。像这样,您甚至不需要地图,因为您只需使用每 16 个增加的密钥,因此 for (int i = 1; i &lt;= k; i++) undirectedGraph.addVertex(i) 将执行完全相同的操作,或者您可以将计数器直接放在图表中并完全保存第二个循环.也许保存位置会对您有更多帮助,但我承认不知道在此图中将其保存在何处,因为我不知道您的其余代码和此图库。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2013-09-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多