You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:05:37