Java 从void方法写入文件
我正在开发一个使用Dijkstra算法的程序,并将结果记录到一个文本文件中。写入文件的代码位如下所示:Java 从void方法写入文件,java,return,void,printwriter,Java,Return,Void,Printwriter,我正在开发一个使用Dijkstra算法的程序,并将结果记录到一个文本文件中。写入文件的代码位如下所示: try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) { pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms "); pr.println("Min-Heap: ");
try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
pr.println("Min-Heap: ");
pr.println("Fibonnaci Heap:");
pr.println("Dijkstra Adjacency Matrix");
pr.println(g.printPath(END));
}
} catch (Exception e) {
}
public void printPath(String end) {
if (!graph.containsKey(end)) {
System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
return;
}
graph.get(end).printPath();
System.out.println();
}
除了g.printPath(END)行之外,我对这段代码没有任何问题。我收到的错误是“此处不允许空白类型”。我完全理解这意味着什么。发生这种情况是因为printPath方法无效。看起来是这样的:
try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
pr.println("Min-Heap: ");
pr.println("Fibonnaci Heap:");
pr.println("Dijkstra Adjacency Matrix");
pr.println(g.printPath(END));
}
} catch (Exception e) {
}
public void printPath(String end) {
if (!graph.containsKey(end)) {
System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
return;
}
graph.get(end).printPath();
System.out.println();
}
因为我需要访问它将打印的变量,所以我尝试修改它,使其具有可以写入文本文件的返回类型。我想到的是:
public String printPath(String end) {
if (!graph.containsKey(end)) {
System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
return null;
}
graph.get(end).printPath();
System.out.println();
return graph.get(end).printPath();
}
这也有错误,因为该方法是string类型,但graph.get(end).printPath()是void(get方法也是void)。我尝试返回其他变量,如graph和graph.get(end),但它们不返回图中的实际变量。我知道graph.get(end).printPath()打印出我想要的正确值。我只是在努力寻找一种储存它们的方法。有没有一种简单的方法可以将其写入我忽略的文本文件,而不必返回并编辑我的所有方法以使它们不无效?谢谢 按照您当前的用法,
printPath
不应该打印任何内容:也许您甚至可以将其重命名为getPath
。您需要构建一个具有正确值的字符串并将其返回,以便将返回的值传递给println
public String printPath(String end) {
if (!graph.containsKey(end)) {
return "End vertex is not contained within graph \"%s\"\n", end);
}
// Also rework this to return a string instead of printlning stuff.
return graph.get(end).printPath();
}
或者,不要将值传递给println
,只需调用g.printPath(END)代码>直接
try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
pr.println("Min-Heap: ");
pr.println("Fibonnaci Heap:");
pr.println("Dijkstra Adjacency Matrix");
g.printPath(END);
} catch (Exception e) {
}
按照您当前的用法,printPath
不应该打印任何内容:甚至可以将其重命名为getPath
。您需要构建一个具有正确值的字符串并将其返回,以便将返回的值传递给println
public String printPath(String end) {
if (!graph.containsKey(end)) {
return "End vertex is not contained within graph \"%s\"\n", end);
}
// Also rework this to return a string instead of printlning stuff.
return graph.get(end).printPath();
}
或者,不要将值传递给println
,只需调用g.printPath(END)代码>直接
try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
pr.println("Min-Heap: ");
pr.println("Fibonnaci Heap:");
pr.println("Dijkstra Adjacency Matrix");
g.printPath(END);
} catch (Exception e) {
}
有一种方法可以通过重定向System.out.print
:
public String printPath(Graph graph, String end) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(bos);
//set output stream to bos to capture output
System.setOut(printStream);
graph.get(end).printPath(); //your output
System.out.println();
//reset output stream to file descriptor
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
return bos.toString();
}
通过tearrayoutputstream将系统输出重定向到
开始打印
将系统输出
重置为文件描述符
最后,真的不要这么做,这是肮脏的代码,重要的是它不是线程安全的,而且很混乱。关于如何处理这一问题,有一个建议:
- 创建一个格式化
图形的方法。获取(end)
并返回正确的String
类型路径
有一种方法可以通过重定向
System.out.print来实现:
public String printPath(Graph graph, String end) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(bos);
//set output stream to bos to capture output
System.setOut(printStream);
graph.get(end).printPath(); //your output
System.out.println();
//reset output stream to file descriptor
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
return bos.toString();
}
通过tearrayoutputstream将系统输出重定向到
开始打印
将系统输出
重置为文件描述符
最后,真的不要这么做,这是肮脏的代码,重要的是它不是线程安全的,而且很混乱。关于如何处理这一问题,有一个建议:
- 创建一个格式化
图形的方法。获取(end)
并返回正确的String
类型路径
graph.get(end)的返回实例是什么?get()是Map.java和graph中的一个方法。get(end)不打印任何值,我相信该方法只获取从开始到结束节点的路径中的值。graph.get(end)的返回实例是什么?get()是Map.java和graph中的一个方法。get(end)不打印任何值,该方法,我相信,只获取从开始到结束节点的路径中的值。也许我误解了您的意思,但是在第一种情况下,如果该方法保持为空,那么它会产生错误,因为第二个返回值是意外的。如果将其设置为类型(例如String),它还会产生错误,因为return语句仍然是void类型。在另一种情况下,g.printPath(END)不会写入文件,它只是将其输出到系统中。很抱歉,我没有将返回类型更改为String,现已修复。正如我的代码片段中的注释所述,您还需要更改printPath以返回字符串,而不是直接输出到PrintStream(System.out)。也许我误解了您的意思,但是在第一种情况下,如果该方法保持为空,那么它会产生错误,因为第二个返回值是意外的。如果将其设置为类型(例如String),它还会产生错误,因为return语句仍然是void类型。在另一种情况下,g.printPath(END)不会写入文件,它只是将其输出到系统中。很抱歉,我没有将返回类型更改为String,现已修复。正如我的代码片段中的注释所说,您还需要更改printPath以返回字符串,而不是直接输出到PrintStream(System.out)