gpt4 book ai didi

Java:for循环中的对象数组赋值

转载 作者:行者123 更新时间:2023-11-30 11:38:21 25 4
gpt4 key购买 nike

我正在尝试使用 Dijkstra 算法找到从特定顶点 (v0) 到其余顶点的最短路径。这已解决,并且适用于以下链接中的此代码: http://en.literateprograms.org/index.php?title=Special:DownloadCode/Dijkstra%27s_algorithm_(Java)&oldid=15444

我在从用户输入的 for 循环中分配 Edge 数组时遇到问题,而不是像这里那样对其进行硬编码。

从每个顶点向 Edge[] 邻接分配一条新边有什么帮助吗?请记住,它可以是 1 个或多个边。

class Vertex implements Comparable<Vertex>
{
public final String name;
public Edge[] adjacencies;
public double minDistance = Double.POSITIVE_INFINITY;
public Vertex previous;
public Vertex(String argName) { name = argName; }
public String toString() { return name; }

public int compareTo(Vertex other){
return Double.compare(minDistance, other.minDistance);
}
}


class Edge{
public final Vertex target;
public final double weight;

public Edge(Vertex argTarget, double argWeight){
target = argTarget; weight = argWeight; }
}

public static void main(String[] args)
{
Vertex v[] = new Vertex[3];
Vertex v[0] = new Vertex("Harrisburg");
Vertex v[1] = new Vertex("Baltimore");
Vertex v[2] = new Vertex("Washington");

v0.adjacencies = new Edge[]{ new Edge(v[1], 1),
new Edge(v[2], 3) };
v1.adjacencies = new Edge[]{ new Edge(v[0], 1),
new Edge(v[2], 1),};
v2.adjacencies = new Edge[]{ new Edge(v[0], 3),
new Edge(v[1], 1) };

Vertex[] vertices = { v0, v1, v2};
/*Three vertices with weight: V0 connects (V1,1),(V2,3)
V1 connects (V0,1),(V2,1)
V2 connects (V1,1),(V2,3)
*/
computePaths(v0);
for (Vertex v : vertices){
System.out.println("Distance to " + v + ": " + v.minDistance);
List<Vertex> path = getShortestPathTo(v);
System.out.println("Path: " + path);
}
}
}

上面的代码可以很好地找到从 v0 到所有其他顶点的最短路径。将新的 edge[] 分配给 edge[] 邻接时会出现问题。

例如,这不会产生正确的输出:

for (int i = 0; i < total_vertices; i++){
s = br.readLine();
char[] line = s.toCharArray();
for (int j = 0; j < line.length; j++){
if(j % 4 == 0 ){ //Input: vertex weight vertex weight: 1 1 2 3
int vert = Integer.parseInt(String.valueOf(line[j]));
int w = Integer.parseInt(String.valueOf(line[j+2]));
v[i].adjacencies = new Edge[] {new Edge(v[vert], w)};
}
}
}

与此相反:

v0.adjacencies = new Edge[]{ new Edge(v[1],  1),
new Edge(v[2], 3) };

我如何获取用户输入并制作一个 Edge[],以将其传递给邻接点?问题是它可能是 0 个边或很多边。

任何帮助将不胜感激谢谢!

最佳答案

在您的情况下,您为 j 的每次迭代分配 v[i].adjacencies...所以这意味着它 line.length = 8,然后 v[i].adjacencies 被分配 2 次。我不认为那是你的意图。

    for (int j = 0; j < line.length; j++){  
if(j % 4 == 0 ){ //Input: vertex weight vertex weight: 1 1 2 3
int vert = Integer.parseInt(String.valueOf(line[j]));
int w = Integer.parseInt(String.valueOf(line[j+2]));
v[i].adjacencies = new Edge[] {new Edge(v[vert], w)};
}

您可以像这样更改您的代码...

    Edge[] edges = new Edge[line.length/4];  
for (int j = 0; j < line.length; j++){
if(j % 4 == 0 ){ //Input: vertex weight vertex weight: 1 1 2 3
int vert = Integer.parseInt(String.valueOf(line[j]));
int w = Integer.parseInt(String.valueOf(line[j+2]));
edges[j/4] = {new Edge(v[vert], w)};
}
v[i].adjacencies = edges;

它可能不是确切的代码,但你必须在循环外分配。

关于Java:for循环中的对象数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656308/

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