Java中Tangible接口数组遍历与背包功能实现问题咨询
基于Tangible接口的背包系统问题解决方案
1. 修复addItem方法的遍历逻辑
你之前的嵌套循环是核心问题——添加物品不需要双层循环,只需单层遍历数组找到第一个空位置即可。嵌套循环会导致逻辑混乱,让if条件无法触发。
正确实现:
private static final int MAX_CAPACITY = 5; private Tangible[] items = new Tangible[MAX_CAPACITY]; public boolean addItem(Tangible item) { // 遍历数组找第一个空位置 for (int i = 0; i < MAX_CAPACITY; i++) { if (items[i] == null) { items[i] = item; return true; // 添加成功 } } // 遍历完成无空位置,背包已满 return false; }
逻辑说明:单层循环逐个检查数组元素,找到null位置就插入物品并返回true;如果循环结束都没找到空位,说明达到MAX_CAPACITY,返回false表示添加失败。
2. getItem方法通过名称匹配Tangible对象
首先需要给Tangible接口添加获取名称的方法,确保所有实现类都能提供名称属性:
public interface Tangible { String getName(); // 你的其他接口方法(如getWeight()等) }
然后在getItem方法中遍历数组,对比非空对象的名称:
public Tangible getItem(String name) { for (Tangible item : items) { if (item != null && item.getName().equals(name)) { return item; } } return null; // 未找到对应物品 }
注意事项:
- 必须先判断
item != null,避免空指针异常 - 如果需要忽略大小写匹配,替换为
item.getName().equalsIgnoreCase(name)
3. 完善容量限制测试与剩余方法实现
验证MAX_CAPACITY限制的JUnit测试
编写测试用例验证背包满时无法添加物品:
import org.junit.Test; import static org.junit.Assert.*; public class BackpackTest { @Test public void testAddItemAtFullCapacity() { Backpack backpack = new Backpack(); // 填满背包 for (int i = 0; i < Backpack.MAX_CAPACITY; i++) { assertTrue(backpack.addItem(new TestTangible("Item" + i))); } // 尝试添加第6个物品,应失败 assertFalse(backpack.addItem(new TestTangible("ExtraItem"))); } // 测试用Tangible实现类 private static class TestTangible implements Tangible { private final String name; public TestTangible(String name) { this.name = name; } @Override public String getName() { return name; } // 实现其他接口方法 } }
removeItem方法实现
通过名称定位物品,删除后可选择将后续元素前移(避免数组中间留空):
public boolean removeItem(String name) { for (int i = 0; i < MAX_CAPACITY; i++) { Tangible item = items[i]; if (item != null && item.getName().equals(name)) { // 删除物品 items[i] = null; // 可选:将后面的元素前移,整理背包 for (int j = i; j < MAX_CAPACITY - 1; j++) { items[j] = items[j + 1]; } items[MAX_CAPACITY - 1] = null; return true; } } return false; // 未找到要删除的物品 }
printItems方法实现
遍历数组打印所有非空物品信息:
public void printItems() { System.out.println("背包内物品:"); for (Tangible item : items) { if (item != null) { System.out.println("- " + item.getName()); // 如果有其他属性,比如重量,可一并打印:item.getWeight() } } }
内容的提问来源于stack exchange,提问作者jason lyman
相关产品推荐
相关产品推荐

