Только вывод последней строки цикла - PullRequest
0 голосов
/ 17 мая 2018
import java.io.*;
import java.util.Random;

public class LargeDataset {
public static void main(String[] args) throws Exception {
    File file = new File("src/Salary.txt");
    if (file.exists()) {
        System.out.print("Sorry this file already exists.");
        System.exit(0);
    }
    String firstName = "";
    String lastName = "";
    String rank = "";
    double salaryRange = 0.0;

    for (int i = 1; i <= 1000; i++) {
        try (PrintWriter output = new PrintWriter(file))
        {
            firstName = "FirstName" + i;
            lastName = "LastName" + i;
            rank = generateRandomRank();
            if (rank == "assistant")
                salaryRange = generateSalary(50000.00, 80000.00);
            else if (rank == "associate")
                salaryRange = generateSalary(60000.00, 110000.00);
            else
                salaryRange = generateSalary(75000.00, 130000.00);
            output.printf("%s %s %s $%.2f", firstName, lastName, rank, salaryRange);
            output.println();
        }
    }
}

public static String generateRandomRank() {
    String[] rank = {"assistant", "associate", "full"};
    Random random1 = new Random();
    return rank[random1.nextInt(3)];
}

public static double generateSalary(double minSalary, double maxSalary) {
    double randomSalary = minSalary + Math.random() * (maxSalary - minSalary);
    return randomSalary;
 }  
}

Привет всем. У меня есть программа, которая генерирует 1000 строк текста и сохраняет его в файл с именем Salary. Формат каждой строки: firstNamei, lastNamei, случайный ранг и случайный оклад, который подходит для этого ранга. Однако, когда я запускаю эту программу, она выводит только 1000-ю строку цикла. Однако я заметил, что когда я не помещаю PrintWriter в оператор try и не закрываю его после цикла сам, он работает нормально и генерирует все 1000 строк. Почему он генерирует только последнюю строку, основываясь на том, как она сейчас?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Каждый раз, когда вы перебираете свой 1000, вы создаете новый файл

for (int i = 1; i <= 1000; i++) {
    try (PrintWriter output = new PrintWriter(file))
    ...
}

перемещаете его перед циклом

 try (PrintWriter output = new PrintWriter(file)) {
   for (int i = 1; i <= 1000; i++) {
   }
 }
0 голосов
/ 17 мая 2018

Вы должны открыть свой PrintWriter один раз , а затем много раз писать в него из цикла, а не наоборот:

try (PrintWriter output = new PrintWriter(file)) {
    for (int i = 1; i <= 1000; i++) {
        firstName = "FirstName" + i;
        lastName = "LastName" + i;
        rank = generateRandomRank();
        if (rank == "assistant")
            salaryRange = generateSalary(50000.00, 80000.00);
        else if (rank == "associate")
            salaryRange = generateSalary(60000.00, 110000.00);
        else
            salaryRange = generateSalary(75000.00, 130000.00);
        output.printf("%s %s %s $%.2f", firstName, lastName, rank, salaryRange);
        output.println();
    }
}

Вам следует использовать приведенный выше шаблонвместо того, что у вас есть.Если вам нужно точное исправление к текущему коду, попробуйте открыть PrintWriter в режиме добавления:

for (int i=1; i <= 1000; i++) {
    try (PrintWriter output = new PrintWriter(new FileOutputStream(file, true)) {
        // same logic
    }
}

Это также должно работать, потому что теперь, даже если вы создаете новый PrintWriterдля каждой итерации цикла (неэффективно) вы открываете базовый файл в режиме append , поэтому каждая новая строка должна записываться правильно.

...