如何按指定优先级规则将对象插入LinkedList队列?
实现按优先级规则插入LinkedList的正确方式
首先,我得指出你当前代码里的几个关键问题:
- 你用了
next.getId()和s.getId()做比较,但需求明确是基于priority属性判断优先级,不是ID - 遍历和插入的逻辑混乱,比如
queue.add(next)会把当前元素重复添加,queue.set(s)的用法也完全不符合插入逻辑 - 既没处理优先级相同的场景,也没正确实现“找不到更低优先级就插末尾”的规则
下面是完全符合你需求的正确实现,我会把逻辑拆解开讲清楚:
User s; // 假设这是要插入的新对象 LinkedList<User> userQueue = getList(); ListIterator<User> iterator = userQueue.listIterator(); boolean inserted = false; while (iterator.hasNext()) { User current = iterator.next(); // 情况1:新对象优先级更高,插入到当前低优先级元素之前 if (s.getPriority() > current.getPriority()) { iterator.previous(); // 回退到当前元素的前一个位置,准备插入 iterator.add(s); inserted = true; break; } // 情况2:优先级相同,继续遍历直到找到同优先级的最后一个元素,插入到它后面 else if (s.getPriority() == current.getPriority()) { // 检查下一个元素是否还是同优先级 if (!iterator.hasNext() || iterator.next().getPriority() != s.getPriority()) { iterator.previous(); // 回退到当前current的位置 iterator.add(s); inserted = true; break; } // 下一个还是同优先级,继续循环找最后一个同优先级元素 } } // 情况3:遍历完所有元素,新对象优先级最低,直接插末尾 if (!inserted) { userQueue.add(s); }
逻辑细节说明:
- 优先级更高的场景:找到第一个优先级低于新对象的元素时,回退一步插入到它前面,保证高优先级元素排在前面
- 优先级相同的场景:会一直遍历到同优先级元素的最后一个,然后插入到它后面,完全符合你“同优先级插在后面”的要求
- 优先级最低的场景:如果遍历完整个列表都没找到比新对象优先级低的元素,就直接把它加在队列末尾
另外,记得给User类补充getPriority()方法来获取优先级属性,这样代码的可读性和规范性会更好。
内容的提问来源于stack exchange,提问作者ctooley17
相关产品推荐
相关产品推荐

