只输出循环的最后一行

Posted

技术标签:

【中文标题】只输出循环的最后一行【英文标题】:Only outputting last line of loop 【发布时间】:2018-10-27 04:13:17 【问题描述】:
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 行。为什么它只根据现在的情况生成最后一行?

【问题讨论】:

【参考方案1】:

你应该打开你的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 模式打开基础文件,因此每个新行应该写得正确。

【讨论】:

@RyanFoster 什么不清楚?您在循环的 each 迭代期间打开 PrintWriter,此外,您没有以附加模式打开它,因此您只需要一行即可覆盖文件。我给了你两个选项来解决你的问题,第一个更好。【参考方案2】:

每次您遍历 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++) 
   
 

【讨论】:

谢谢,这很有道理。 如果这个答案有帮助,请考虑投票和/或接受这个答案

以上是关于只输出循环的最后一行的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 只输出最后循环数据

嵌套的while循环只输出一行来选择php中的标签

新手提问 python for循环问题 print (y) #这里为啥只输出一行?

闭包循环问题-for循环只显示最后一个i的值

ArrayList循环仅输出最后一项[重复]

Java小案例——使用双重for循环实现杨辉三角的输出