当前位置: 首页 > 知识库问答 >
问题:

维护数据结构,使其具有ArrayList链接上的值

杜俊远
2023-03-14

这是我的问题。我有一个vertex对象的hashmap(将城市名称映射到相应的对象)。

我需要做一个图形来模拟这些城市之间的路线。

for (Edge e : edges) {
    ArrayList<Vertex> list = adjList.get(e.v1);
    if (list == null)
        list = new ArrayList<>();
    list.add(e.v2);
    adjList.put(e.v1, list);
}

edges:  ArrayList of edges having (v1,v2,weight) in each object
list :  The adjacency list for the vertex v1.
adjList: HashMap which has all the lists index by the vertex.

因为我的vertex对象每个顶点只创建一次,所以我不能在其中存储,因为在其中存储1个边长度将覆盖进入其中的所有其他边。

共有1个答案

谢飞舟
2023-03-14

假设在顶点v1v2之间只有一条边,您可以创建一个HashMap ,edge> 来映射通过边连接的顶点。

HashMap<Pair<Vertex, Vertex>, Edge> vertexMap = new HashMap<>();

for (Edge e : edges) {
    Pair<Vertex, Vertex> key = new Pair<>(e.v1, e.v2);
    vertexMap.put(key, e);
}

这样,您就可以通过vertexmap.get(new pair (v1,v2)) 查找给定给顶点的边

pair可以实现如下

class Pair<K, V> {
    private final K first;
    private final V second;

    public Pair(K first, V second) {
        this.first = first;
        this.second = second;
    }

    public K getFirst() {
        return first;
    }

    public V getSecond() {
        return second;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + Objects.hashCode(this.first);
        hash = 89 * hash + Objects.hashCode(this.second);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Pair<?, ?> other = (Pair<?, ?>) obj;
        if (!Objects.equals(this.first, other.first)) {
            return false;
        }
        if (!Objects.equals(this.second, other.second)) {
            return false;
        }
        return true;
    }
}

如果您的图是无向的,您也可以在循环中添加关系的逆:

for (Edge e : edges) {
    Pair<Vertex, Vertex> keyInverted = new Pair<>(e.v2, e.v1);
    vertexMap.put(keyInverted, e);
}
 类似资料:
  • 数据结构和算法是过去 50 年来最重要的发明之一,它们是软件工程师需要了解的基础工具。但是在我看来,这些话题的大部分书籍都过于理论,过于庞大,也是“自底向上”的

  • 问题内容: 我的情况如下:我有一个数据表(少数字段,少于一百行),该数据表在程序中广泛使用。我还需要这些数据具有持久性,因此我将其另存为CSV并在启动时加载。我之所以选择不使用数据库,是因为每个选项(甚至是SQLite)对于我的卑微要求都是过高的(另外- 我希望能够以一种简单的方式离线编辑值,没有什么比记事本更简单的了)。 假设我的数据如下所示(在文件中用逗号分隔,没有标题,这只是一个示例): 笔

  • 本节介绍MATLAB中的一些其他数据结构,包括: 多维数组 单元数组 字符与文本 结构体

  • 问题内容: 我有一个,并向其中添加了一个数组。 假设我想知道是否包含一个不使用的数组,因为我将从另一个类调用它。因此,我在其中创建了一个新数组… …但是即使将其添加到列表中,它也会返回false ,并且包含与完全相同的数组。 有没有一种方法可以使用contains,这样我就可以检查是否其中的元素之一具有数组值? 问题答案: 数组只能与Arrays.equals()比较。 您可能需要ArrayLis

  • 如何维护唯一数组的? 例如,如果我有以下数组:

  • 我正在研究一个编码面试,发现了一个问题,从时间复杂性方面来说,它将从像这样的数据结构中受益匪浅,但它允许通过索引获取元素。类似地,允许插入的在保持自然秩序的同时也会起作用。Java中有这样的数据结构吗?