2016-03-29 3 views
0

Я работаю над программой, которая использует алгоритм Дейкстры и записывает результаты в текстовый файл. Бита кода у меня есть, что запись в файл выглядит следующим образом:Запись в файл из метода void

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), за исключением. Ошибка, которую я получаю, это «тип недействительности здесь не разрешен». Я полностью понимаю, что это значит. Это происходит потому, что метод 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(); 

} 

Поскольку мне нужен доступ к переменной она будет печатать, я попытался изменить его, чтобы иметь тип возвращаемого значения, что я мог бы написать в текстовый файл. То, что я придумал это было:

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 (конец) .printPath() является ничтожным (метод прибудете также аннулируются). Я попытался вернуть другие переменные, такие как graph и graph.get (end), но они не возвращают фактические переменные внутри графика. Я знаю, что graph.get (end) .printPath() выводит правильные значения, которые я хочу. Я просто пытаюсь найти способ их хранения. Есть ли простой способ записать это в текстовый файл, который я просматриваю без необходимости возвращаться и редактировать все мои методы, чтобы сделать их не пустыми? Благодаря!

+0

Что такое возвращение экземпляра graph.get (конец)? – additionster

+0

get() - метод в Map.java и graph.get (end) не печатает никакого значения, метод, я считаю, просто получает значения в пути от начала до конечного узла. – user3068177

ответ

1

Существует способ сделать это с помощью редиректа 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(); 
} 
  1. перенаправлять System.out к ByteArrayOutputStream,
  2. Начало печати
  3. Сброс System.out в FileDescriptor
в

Наконец, действительно не предлагайте это, это грязный код и важно, что это не потокобезопасный, и это сбивает с толку. Существует предположение о том, как иметь дело это:

  • Создать метод formatt graph.get(end) и вернуть правильный путь String типа
1

С вашим текущим использованием 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) { 
} 
+0

Возможно, я не понимаю вас, но в первом случае, если метод оставлен недействительным, он вызывает ошибку, потому что второе возвращаемое значение является неожиданным. Если вы сделаете его типом, скажем, String, он также выдает ошибку, потому что оператор return по-прежнему имеет тип void. В альтернативном случае g.printPath (END) не записывает в файл, он просто выводит его в систему. – user3068177

+0

Извините, что я пропустил изменение типа возврата на String, исправлено сейчас. Как говорится в комментарии в моем фрагменте, вам также нужно изменить printPath, чтобы вернуть строку вместо вывода прямо в PrintStream (System.out) –

Смежные вопросы