从 void 方法写入文件
Writing to a file from a void method
我正在开发一个使用 Dijkstra 算法并将结果记录到文本文件的程序。我拥有的写入文件的代码如下所示:
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) {
}
除了行 g.printPath(END) 之外,我对这段代码没有任何问题。我收到的错误是 "void type not allowed here"。我完全明白这意味着什么。这是因为 printPath 方法无效。它看起来像这样:
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();
}
因为我需要访问它将打印的变量,所以我尝试将其修改为具有可以写入文本文件的 return 类型。我想到的是:
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();
}
这又是错误的,因为该方法是字符串类型,但 graph.get(end).printPath() 是无效的(get 方法也是无效的)。我尝试 returning 其他变量,例如 graph 和 graph.get(end) 但它们没有 return 图中的实际变量。我知道 graph.get(end).printPath() 打印出我想要的正确值。我只是在努力寻找一种方法来存储它们。有没有一种简单的方法可以将其写入我忽略的文本文件,而不必返回并编辑我的所有方法以使它们不无效?谢谢!
根据您当前的使用情况,printPath
不应打印任何内容:也许您甚至可以将其重命名为 getPath
。您需要构建一个具有正确值的字符串并 return 它,以便 returned 值可以传递给 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();
}
- 将
System.out
重定向到 ByteArrayOutputStream
、
- 开始打印
- 将
System.out
重置为 FileDescriptor
最后,真的不建议这样做,它是肮脏的代码,重要的是它不是线程安全的,而且很混乱。有一个关于如何处理这个的建议:
- 创建一种格式化
graph.get(end)
和 return 正确 String
类型路径的方法
我正在开发一个使用 Dijkstra 算法并将结果记录到文本文件的程序。我拥有的写入文件的代码如下所示:
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) {
}
除了行 g.printPath(END) 之外,我对这段代码没有任何问题。我收到的错误是 "void type not allowed here"。我完全明白这意味着什么。这是因为 printPath 方法无效。它看起来像这样:
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();
}
因为我需要访问它将打印的变量,所以我尝试将其修改为具有可以写入文本文件的 return 类型。我想到的是:
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();
}
这又是错误的,因为该方法是字符串类型,但 graph.get(end).printPath() 是无效的(get 方法也是无效的)。我尝试 returning 其他变量,例如 graph 和 graph.get(end) 但它们没有 return 图中的实际变量。我知道 graph.get(end).printPath() 打印出我想要的正确值。我只是在努力寻找一种方法来存储它们。有没有一种简单的方法可以将其写入我忽略的文本文件,而不必返回并编辑我的所有方法以使它们不无效?谢谢!
根据您当前的使用情况,printPath
不应打印任何内容:也许您甚至可以将其重命名为 getPath
。您需要构建一个具有正确值的字符串并 return 它,以便 returned 值可以传递给 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();
}
- 将
System.out
重定向到ByteArrayOutputStream
、 - 开始打印
- 将
System.out
重置为FileDescriptor
最后,真的不建议这样做,它是肮脏的代码,重要的是它不是线程安全的,而且很混乱。有一个关于如何处理这个的建议:
- 创建一种格式化
graph.get(end)
和 return 正确String
类型路径的方法