Java实现ArrayList对象E1-E5格式唯一动态命名的问题咨询
代码存在的核心问题
- 逻辑结构错误:双层循环设计完全不符合需求,外层循环变量i未参与任何逻辑判断,内层遍历过程中只要当前遍历到的节点名称和
E+j不相等,就直接修改node的名称,没有校验E+j是否在整个列表中不存在,导致最终拿到的名称大概率还是重复的。 - 循环边界错误:遍历编号的上限设为了当前列表的元素个数,而需求要求编号范围是1~5,比如当前列表只有2个元素
[E3,E5],你最多只会遍历到j=2,根本不会判断E1是否可用,直接漏掉了可用编号。 - 判断条件逻辑错误:原有break条件是
E+j同时等于当前遍历节点名称和node名称才终止,完全没有匹配「找最小未使用编号」的需求逻辑。 - 缺少容量校验:没有判断当前列表是否已经达到5个元素的上限,列表满员时仍然执行赋值逻辑。
正确实现参考
// 先判断容量是否已满 int maxSize = 5; int currentSize = circuit.getNbStartNodes(); if (currentSize >= maxSize) { throw new RuntimeException("列表最多容纳5个元素"); } // 收集所有已使用的编号 Set<Integer> usedNos = new HashSet<>(); for (int i = 0; i < currentSize; i++) { StartNode existNode = (StartNode) circuit.getStartNode(i); String name = existNode.getName(); // 提取编号数字部分 if (name != null && name.startsWith("E")) { try { int no = Integer.parseInt(name.substring(1)); usedNos.add(no); } catch (NumberFormatException ignored) { // 格式异常的名称直接忽略,对应编号当成未占用处理 } } } // 从小到大找第一个可用编号 int availableNo = -1; for (int j = 1; j <= maxSize; j++) { if (!usedNos.contains(j)) { availableNo = j; break; } } // 给新节点赋值名称 StartNode node = new StartNode(); node.setName("E" + availableNo); // 后续执行添加node到列表的逻辑即可
内容的提问来源于stack exchange,提问作者asmazizou
相关产品推荐
相关产品推荐

