java stringbuilder 删除一行

java stringbuilder deleting a line

所以我有这个问题。我使用过 StringBuilder,我正在尝试使用 JOptionPane 创建一个显示函数,该函数将显示员工的姓名和工资。每次从系统中删除员工姓名时,显示功能也必须删除一行,因为我不想在我的 JOptionPane 框中有空行。但是,我无法让它正确显示,因为当我尝试删除员工姓名时,它会删除自己的员工姓名,以及列表中它之前的所有员工姓名。 staffDetails 是一个单独的数组,其中包含员工的姓名和工资。 这是我显示员工的代码:

public static StringBuilder staffRecord= new StringBuilder();
  public static void displayrezStaffRecord(){
      int staffnumber=1;
      for (int n=0;n<staffDetails.length;n++){
          staffRecord.append(staffDetails[n].getStaffName());
          staffRecord.append("\t ");
          staffRecord.append(staffDetails[n].getPay());
          staffRecord.append(" \n ");
          staffnumber++;
          if (staffDetails[n].getStaffName()==null){
              menunumber--;
              staffRecord.delete(0,staffRecord.length());

          }

  }
      String finalresult= staffRecord.toString();
      JOptionPane.showMessageDialog(null,"Staff_No       Staff_Name      Pay      \n" +finalresult);
  } 
}

只需检查 null 并跳过此工作人员。 staffnumber 一开始应该是 0。此外,您不必使 StringBuilder 成为静态成员,只需创建新的 StringBuilder。 (否则每次调用该方法都要清空)

public static void displayrezStaffRecord() {
    int staffnumber = 0;
    StringBuilder staffRecord= new StringBuilder();
    for (int n = 0; n < staffDetails.length; n++) {
        if (staffDetails[n].getStaffName() == null) {
            menunumber--;
            continue;
        }
        staffRecord.append(staffDetails[n].getStaffName());
        staffRecord.append("\t ");
        staffRecord.append(staffDetails[n].getPay());
        staffRecord.append(" \n ");
        staffnumber++;
    }
    String finalresult = staffRecord.toString();
    JOptionPane.showMessageDialog(null, "Staff_No       Staff_Name      Pay      \n" + finalresult);
}

不知道是不是因为你的代码不完整,没看到哪里用到变量staffnumber

我最好的建议是避免同时进行两项操作。在这里,您尝试过滤掉已删除的员工,同时将他们的数据附加到 StringBuilder。理想情况下,我会先过滤掉员工,然后使用它们来创建我的 String 输出。考虑到这一点,您的方法将如下所示:

public static void display() {

StringBuilder builder = new StringBuilder();

List<Employee> filtered = Arrays.stream(employees)
                                .filter(employee -> employee.getName() == null)
                                .collect(Collectors.toList());


filtered.forEach(employee ->
    builder.append(employee.getName())
           .append("\t ")
           .append(employee.getPay())
           .append("\n "));

String output = builder.toString();
JOptionPane.showMessageDialog(null,"Staff_No       Staff_Name      Pay      \n" + output);
}

假设您将员工存储在一个 Employees 数组中,我基本上会流式传输该数组,过滤掉所有名称为空的条目,将结果收集在一个列表中。

有了这个列表,我会继续使用 StringBuilder 来构建我的输出消息,以显示在对话框中。还要注意,我认为让 StringBuilder 成为 class 的静态成员没有任何意义。您可以在方法的上下文中使用它。

完成上述所有操作后,您将在这里执行两个截然不同的操作。一个是过滤掉所有不需要的条目,另一个是输出字符串的实际构造。

尝试只删除当前员工并在删除后减少员工人数,如您的 if 语句中的以下内容:

   if (staffDetails[n].getStaffName()==null){
      menunumber--;
      staffRecord.delete(staffRecord.length()-4,staffRecord.length());
      staffnumber--;
   }