【问题标题】:How to search for an Object in ArrayList?如何在 ArrayList 中搜索对象?
【发布时间】:2020-12-14 18:38:38
【问题描述】:

我想使用其中一个属性在数组列表中搜索对象:字符串名称。

我已在此处打印出 Item Found,效果很好。

    public static void searchItems() {
    // variable declaration
    String itemSearch;
    
    // collect value of variable using Scanner class
    System.out.println("\t\tSEARCH ITEMS");
    System.out.println("Enter item name: ");
    itemSearch = input.next();

    //search for an item
    for (int i=0; i<itemList.size();i++) {
        if (itemList.get(i).name.equalsIgnoreCase(itemSearch)) {
            
            System.out.println("\t\t[ITEM FOUND]");
        }
    }
}

但是,我也想在项目未找到时发出通知。当我将 else 添加到此 for 循环时,String itemSeacrh 与数组列表中的所有对象匹配(可能不是正确的术语,抱歉),并打印出每个对象索引的通知.

让我解释一下。假设,objects:book、pen 和 pencil 按各自的顺序存储在 ArrayList itemList 中,for 循环修改如下:

for (int i=0; i<itemList.size();i++) {
        if (itemList.get(i).name.equalsIgnoreCase(itemSearch)) {
            
            System.out.println("\t\t[ITEM FOUND]");
        }
        else {
            System.out.println("\t\t[ITEM NOT FOUND]");
        }
    }

我想搜索这本书。当我以 itemSearch 的身份输入 book 时,控制台会打印以下内容:

                SEARCH ITEMS
Enter item name:
book
                [ITEM FOUND]
                [ITEM NOT FOUND]
                [ITEM NOT FOUND]

如您所见,它会检查并打印这本书是否在其他对象中未找到,这并不是我真正想到的。我希望它打印 item founditem not found,而不是同时打印。

谢谢。希望您能理解我的问题。

【问题讨论】:

  • 定义一个布尔值,如果找到该项目,您将其设置为true。在循环之后,写一个涉及布尔值的if-else

标签: java for-loop object if-statement arraylist


【解决方案1】:

创建了列表和搜索项:

List<String> list = new ArrayList<String>();
    list.add("book");
    list.add("pencil");
    list.add("note");

    String itemToBeSearched = "book"; // taken as example

    if(check(list,itemToBeSearched)){
        System.out.println("ITEM FOUND");
    }
    else
    {
        System.out.println("NOT FOUND");
    }

那么物品检查功能就是

public static boolean check(List<String> list, String itemToBeSearched){
    boolean isItemFound =false;
    for(String singleItem: list){
        if(singleItem.equalsIgnoreCase(itemToBeSearched)){
            isItemFound = true;
            return isItemFound;
        }
    }
    return  isItemFound;
}

它对我有用,请试试这个并告诉我们:)

【讨论】:

    【解决方案2】:

    最简单的方法是在找到这本书后打印,然后返回。这样一来,您将在找到该书后停止迭代,并立即离开该函数:

    for (int i=0; i<itemList.size();i++) {
        if (itemList.get(i).name.equalsIgnoreCase(itemSearch)) {
            System.out.println("\t\t[ITEM FOUND]");
            return;
        }
    }
    
    System.out.println("\t\t[ITEM NOT FOUND]");
    

    这将不允许您在找到图书后对图书进行任何进一步处理,因此您可能希望将图书存储在循环外的变量中,并在条件中执行一些代码:

    Item item = null;
    
    for (int i=0; i<itemList.size();i++) {
        if (itemList.get(i).name.equalsIgnoreCase(itemSearch)) {
            item = itemList.get();
            break;
        }
    }
    
    if null != item {
        System.out.println("\t\t[ITEM FOUND]");
        // do some stuff ...
    } else {
        System.out.println("\t\t[ITEM NOT FOUND]");
        // do some other stuff ...
    }
    

    作为最后一点,请考虑使用 for-each 循环,因为它们通常更易于阅读,faster 比典型的 for 循环:

    for (Item item: itemList) {
        // do some stuff ...
    }
    

    【讨论】:

      【解决方案3】:

      其他用户提到的所有其他方法似乎都不错。只是为了让你接触一些新的东西,这是我的 2 美分。您可以使用Java Stream API 来查找与您的搜索词匹配的任何内容。我觉得它更具可读性,但这是我个人的喜好。

      class Item {
          String name;
          public Item(String name) {
              this.name = name;
          }
      }
      
      public class Test {
          public static void main(String[] args) {
              // Mock your senario which you have a search term and 
              // array of object with a public property 'name'
              String itemSearch = "test1";
              List<Item> itemList = List.of(new Item("test4"), new Item("test2"), new Item("test3"), new Item("test1"));
      
              boolean searchTermExists = itemList
                  // Create a stream of items from the item list
                  .stream() 
                  // Searching if any matches the condition (Predicate) and 
                  // return as soon as we find a match
                  .anyMatch((item) -> item.name.equalsIgnoreCase(itemSearch)); 
              if(searchTermExists) {
                  System.out.println("\t\t[ITEM FOUND]");
              }else {
                  System.out.println("\t\t[ITEM NOT FOUND]");
              }
          }
      }
      

      如果你想得到实际的第一个项目,那么你可以使用

      Item foundItem = itemList
          .stream()
          .filter((item) -> item.name.equalsIgnoreCase(itemSearch))
          .findFirst()
          .orElse(null);
      System.out.println(foundItem);
      

      【讨论】:

        【解决方案4】:

        有很多方法可以搜索一个项目 所以在将项目添加到列表后 使用字符串与原始项目进行比较 因此,如果未找到该项目,将在循环结束后打印一条语句

         System.out.println("Enter an item to search for:");
            String item = sc.nextLine();
            String notFound = null;
        

        这是我使用“ma​​tches”方法在列表中搜索“字符串”的代码

         System.out.println("Enter an item to search for:");
            String item = sc.nextLine();
            String notFound = null;
            
            for (int i = 0; i < list.size(); i++) {
                boolean check = list.get(i).matches(item);
                if(check){
                    System.out.println("item is found.");
                    notFound=item;
                    break;
                }
            }
            if(notFound == null){
                System.out.println("item not found.");
            }
        

        【讨论】:

        • 它显示一个错误:“方法matches(String) 未定义类型Item Java(67108964)”
        猜你喜欢
        • 2012-02-28
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2017-09-08
        • 1970-01-01
        • 2016-01-07
        相关资源
        最近更新 更多