当前位置: 首页 > 知识库问答 >
问题:

java中对象数组中的线性和二进制搜索

宋俊艾
2023-03-14

我正在创建一个对象数组,其中应该通过线性方法和二进制方法进行搜索。

问题是如何使用适当的数据类型遍历数组并进行比较。

public class FoodMain {

static Scanner sc = new Scanner(System.in);

public static void main(String[] args) {
    
    Food[] foodlist = new Food[3];
    
    //Initialising food objects array
    for (int i = 0; i < foodlist.length; i++) {
        foodlist[i] = new Food(Food.getId(), Food.getDescription(), Food.getIngredients(), Food.getSellingPrice()); 
    }
    
    FoodMain foodObj = new FoodMain();
    foodObj.show(foodlist);
    
    System.out.print("Enter the search value: ");
    int value = sc.nextInt(); 
    
    for(int j=0; j < foodlist.length; j++) {
        // Error on line Incompatible operand types Food and int
        if(foodlist[j] == value) {
            System.out.println("The value " + value + " is at index " + j);
            break;
        }
        else {
            System.out.println("Value not in array!!!");
            break;
            }
        }

}

要搜索的对象数组的屏幕截图数组对象

这是食品类的代码

package foodObjectArray;

import java.util.Scanner;

public class Food {

static Scanner sc = new Scanner(System.in);

public  int id;
public  String description;
public  String ingredients;
public  double sellingPrice;

// Food Class constructor
public Food(int id, String description, String ingredients, double sellingPrice) {
super();
this.id = id;
this.description = description;
this.ingredients = ingredients;
this.sellingPrice = sellingPrice;
}


public static int getId() {
    System.out.println("Input food ID");
    return sc.nextInt();
}



public static String getDescription() {
    System.out.println("Input food description");
    return sc.next();
}



public static String getIngredients() {
    System.out.println("Enter the Ingredients");
    return sc.next();
}



public static double getSellingPrice() {
    System.out.println("Input food Price");
    return sc.nextDouble();
}

希望这能帮助我解释

共有2个答案

叶福
2023-03-14

让我们忽略所有其他问题,只关注线性搜索。假设您正在按id搜索。

    for(int j=0; j < foodlist.length; j++) {
        if(foodlist[j].id == value) {
            System.out.println("The value " + value + " is at index " + j);
            break;
        }
        else {
            System.out.println("Value not in array!!!");
            break;
            }
        }

}

如果第一项不匹配,else分支将中断循环。它不会搜索整个数组。它实际上只是查看数组中的第一项。

您需要删除其他分支并使用标志(布尔值)或其他变量来指示找到。

int foundIndex = -1;   //-1 means not found.

for(int j=0; j < foodlist.length; j++) {
  if(foodlist[j].id == value) {
    foundIdex = j;
    break;
   }
}

if (indexFound > -1)
  System.out.println("Found at " + indexFound);
else 
  System.out.println("Not found.");
沈华晖
2023-03-14

这里至少有几个错误。

首先,您不想要if(fodlist[j]. id==value){吗?这将缓解不兼容的操作数。您需要指定要匹配的字段。

风格警察会讨厌你的代码,并要求你定义getter和setter。但是没有搜查令,你不能让他们进来

此外,当您修复了代码将输出“值不在数组中!!!”对于与搜索值不匹配的每个项目。

您需要将“未找到”检查移出for循环。但让我们一步一步来。

 类似资料:
  • 问题内容: 有什么方法可以在具有对象的ArrayList中实现二进制搜索?在此示例中,ArrayList将使用字段“ id”进行排序。 如果我应该使用二进制搜索返回具有指定ID的用户,“ User getUserById(ArrayList users,int userid)”将如何?这有可能吗? 问题答案: Java教程的对象排序文章中有一个示例,您可以编写自己的示例以对自定义类型进行比较。 然

  • 问题内容: 是否有一个库函数对列表/元组执行二进制搜索,如果找到则返回项目的位置,否则返回“ False”(-1,None等)? 我在bisect模块中找到了函数,但是即使该项目不在列表中,它们仍然会返回位置。这对于他们的预期用途来说是完全可以的,但是我只想知道列表中是否包含某项(不想插入任何内容)。 我考虑过使用然后检查该位置处的项目是否等于我要搜索的项目,但这似乎很麻烦(而且我还需要进行边界检

  • 我一直在学习Coursera上的DSA课程,本周介绍了搜索算法。而二进制搜索(O(logn))的复杂度优于线性搜索(O(n))。但是,考虑到首先对数组进行排序需要nlogn工作,为什么我要在未排序的数组中使用它呢。 如果二进制搜索只在数组已经排序的情况下使用,那么为什么这两种算法经常比较,因为显然它们有不同的用例。

  • 我在这里遵循这个例子: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html 以下查询: 与预期的一条记录匹配。假设我只想返回用户为“约翰·史密斯”和“艾利斯·怀特”的文档。 我试过: 但这返回零结果。我如何获得同时包含“Alice White”和“John Smith”的文档(这应该只是在原始结果中

  • 问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法:

  • 我想输出给定值数组的二叉搜索树。它遵循二叉搜索树原理。图表向左旋转 这是所需的输出: 我该怎么修