JavaFX账户程序:如何避免随机索引覆盖数组元素及索引变更问题?
问题解决方案
1. 避免随机索引重复覆盖已存账户
当前create方法直接用随机索引赋值,会覆盖已有数据。解决思路是:生成随机索引后先检查该位置是否为空,若不为空则重新生成,直到找到空位置;同时要判断数组是否已满,已满则提示用户无法创建新账户。
修改后的create方法代码:
SecureRandom rand = new SecureRandom(); int randomNum; String label; String[] name = new String[5]; int[] age = new int[5]; // 假设这是存储年龄的全局数组 public void create(ActionEvent event) { nameText = nameField.getText(); // 先检查数组是否还有空位 boolean hasEmptySlot = false; for (String s : name) { if (s == null) { hasEmptySlot = true; break; } } if (!hasEmptySlot) { label = "账户数量已达上限,无法创建新用户"; displayLabel.setText(label); return; } // 循环生成随机索引,直到找到空位置 do { randomNum = rand.nextInt(5); } while (name[randomNum] != null); name[randomNum] = nameText; // 假设存在输入年龄的字段ageField,同步存储年龄 age[randomNum] = Integer.parseInt(ageField.getText()); label = "用户创建成功,位置:" + randomNum; displayLabel.setText(label); }
2. 查询时保留原索引关联其他数据
不要过滤原数组生成新数组,直接遍历原数组并跳过null元素,同时记录匹配元素的原索引,这样就能正确关联age数组的数据,既避免NullPointerException,又不会破坏索引对应关系。
修改后的search方法代码:
public void search(ActionEvent event) { nameText = nameField.getText(); int foundIndex = -1; // 遍历原数组查找匹配项,自动跳过null元素 for (int i = 0; i < name.length; i++) { String currentName = name[i]; if (currentName != null && currentName.equals(nameText)) { foundIndex = i; break; } } if (foundIndex != -1) { label = "用户 " + nameText + " 已注册,年龄:" + age[foundIndex]; } else { label = "用户 " + nameText + " 未注册"; } nameField.setText(""); displayLabel.setText(label); }
额外优化建议
把账户信息封装成一个User类,包含name和age字段,用单个数组存储User对象,比分开的name、age数组更易维护,也从根源上避免索引不匹配问题:
class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } // getter方法 public String getName() { return name; } public int getAge() { return age; } } // 全局数组修改为 User[] users = new User[5]; // 创建账户时 users[randomNum] = new User(nameText, Integer.parseInt(ageField.getText())); // 查询时 for (int i = 0; i < users.length; i++) { User user = users[i]; if (user != null && user.getName().equals(nameText)) { foundIndex = i; break; } }
内容的提问来源于stack exchange,提问作者J M
相关产品推荐
相关产品推荐

