如何解决如何在ArrayList中搜索对象?
我想使用以下属性之一在数组列表中搜索对象:字符串名称。
我已经在此处打印出找到的物品,并且效果很好。
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
与arraylist中的所有对象匹配(可能不是完全正确的术语,对不起)打印出每个对象索引的通知。
让我解释一下。假设对象:书,笔和铅笔以相应的顺序存储在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
时,控制台中将显示以下内容:
SEARCH ITEMS
Enter item name:
book
[ITEM FOUND]
[ITEM NOT FOUND]
[ITEM NOT FOUND]
如您所见,它检查并打印出在其他对象中找不到的书,这并不是我真正想到的。我希望它打印找到的项目或找不到的项目,而不是同时打印。
谢谢。希望您能理解我的查询。
解决方法
最简单的方法是在找到书后打印并返回。这样,一旦找到书,您将停止迭代,并立即离开该函数:
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循环,因为它们通常比典型的for循环更易于阅读和faster:
for (Item item: itemList) {
// do some stuff ...
}
,
创建了列表和搜索项:
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美分。您可以使用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);
,
有多种搜索项目的方法 所以将项目添加到列表之后 使用字符串与原始项目进行比较 因此,如果找不到该项目,则循环结束后将打印一条语句
System.out.println("Enter an item to search for:");
String item = sc.nextLine();
String notFound = null;
这是我使用“ 匹配”方法在列表中搜索“字符串”的代码
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.");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。