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

Java中对象数组的线性搜索与二分搜索实现问题

对象数组的线性搜索与二分搜索实现方案

错误原因分析

你遇到的「Food与int操作数类型不兼容」错误,是因为直接将Food类型的对象(foodlist[j])和int类型的搜索值(value)用==比较,两者类型完全不匹配。正确的做法是比较对象的id属性(因为你输入的搜索值是食物ID)。另外原代码的循环逻辑有问题:第一次不匹配就直接break,会导致只检查第一个元素就终止,无法遍历整个数组。

修正后的线性搜索代码

public class FoodMain {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        Food[] foodlist = new Food[3];
        
        // 初始化食物对象数组
        for (int i = 0; i < foodlist.length; i++) {
            foodlist[i] = new Food(Food.getId(), Food.getDescription(), Food.getIngredients(), Food.getSellingPrice()); 
        }
        
        // 打印数组内容
        show(foodlist);
        
        System.out.print("Enter the search value (food ID): ");
        int value = sc.nextInt(); 
        
        boolean found = false;
        for(int j=0; j < foodlist.length; j++) {
            // 比较Food对象的id属性和搜索值
            if(foodlist[j].id == value) {
                System.out.println("The value " + value + " is at index " + j);
                found = true;
                break;
            }
        }
        // 遍历完所有元素后判断是否找到
        if(!found) {
            System.out.println("Value not in array!!!");
        }
    }

    // 实现show方法打印食物列表
    public static void show(Food[] foodlist) {
        System.out.println("Food List:");
        for(Food food : foodlist) {
            System.out.println("ID: " + food.id + ", Description: " + food.description);
        }
    }
}

二分搜索实现

二分搜索要求数组已排序,所以需要先对foodlist按id排序,再实现二分逻辑:

1. 排序数组(按id升序)

使用Arrays.sort配合自定义比较器完成排序:

import java.util.Arrays;

// 在main方法初始化数组后添加排序代码
Arrays.sort(foodlist, (a, b) -> Integer.compare(a.id, b.id));

2. 二分搜索方法实现

public static int binarySearch(Food[] foodlist, int targetId) {
    int left = 0;
    int right = foodlist.length - 1;
    
    while(left <= right) {
        int mid = left + (right - left) / 2;
        if(foodlist[mid].id == targetId) {
            return mid; // 找到目标,返回索引
        } else if(foodlist[mid].id < targetId) {
            left = mid + 1; // 目标在右半部分
        } else {
            right = mid - 1; // 目标在左半部分
        }
    }
    return -1; // 未找到返回-1
}

3. 在main方法中调用二分搜索

// 先排序数组
Arrays.sort(foodlist, (a, b) -> Integer.compare(a.id, b.id));
System.out.print("Enter ID to search (binary): ");
int target = sc.nextInt();
int resultIndex = binarySearch(foodlist, target);
if(resultIndex != -1) {
    System.out.println("Found at index: " + resultIndex);
} else {
    System.out.println("ID not found!");
}

额外优化建议

  • 将Food类的静态getter改为非静态:当前getId()等方法是静态的,所有Food对象共享同一输入逻辑,不符合面向对象设计。建议改为实例方法,或在初始化时直接通过Scanner输入参数后传入构造器。
  • 封装Food类的属性:将id、description等属性设为private,并提供公共getter方法(如public int getId()),遵循封装原则。

内容的提问来源于stack exchange,提问作者raj_b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18