java stringbuilder删除一行

时间:2018-08-05 13:54:50

标签: java stringbuilder

所以我有这个问题。我使用了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);
  } 
}

3 个答案:

答案 0 :(得分:1)

只需检查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的地方都看不到。

答案 1 :(得分:1)

我最好的建议是避免同时执行两个操作。在此,您尝试在将删除的员工追加到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成为类的静态成员没有任何意义。您很可能在方法的上下文中拥有它。

完成以上所有操作后,您将在此处执行两个非常不同的操作。一种是过滤掉所有不需要的条目,另一种是输出字符串的实际构造。

答案 2 :(得分:0)

尝试像if语句中的以下内容一样,仅删除当前人员并减少人员数量:

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