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