如何检查字符串是不是包含在 ArrayList 中?包含不起作用[重复]
Posted
技术标签:
【中文标题】如何检查字符串是不是包含在 ArrayList 中?包含不起作用[重复]【英文标题】:How to check if a String is contained in the ArrayList? Contains doesn't work [duplicate]如何检查字符串是否包含在 ArrayList 中?包含不起作用[重复] 【发布时间】:2022-01-17 00:43:26 【问题描述】:我的代码几乎准备好了,我只是无法解决一个简单的问题。 我想在 ArrayList 中添加标识代码和附加到它的项目。 例如,括号只是为了明确我想要做什么,它们不是代码或输出的一部分:
3ZU2SD34:上古卷轴(-!添加) 9ZU5SD54:FIFA 21(-!添加) 3ZU2SD34:上古卷轴(-!未添加,ID 已在列表中) 3ZU2SD34:最终幻想(-!未添加,ID 已在列表中) 4ZU8SD89:NBA 2K22(-!添加)...等等。
我的代码如下所示:
import java.util.ArrayList;
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
ArrayList<Item> items = new ArrayList<>();
while (true)
System.out.println("Identifier? (empty will stop)");
String identifier = scanner.nextLine();
if (identifier.isEmpty())
break;
System.out.println("Name? (empty will stop)");
String name = scanner.nextLine();
if (name.isEmpty())
break;
/*if (!items.contains(identifier)) This doesn't work
items.add(new Item(identifier, name));
*/
if (!items.contains(new Item(identifier,name)))
items.add(new Item(identifier, name)); //this works fine, but I want to skip even if only the ID is equal
System.out.println("");
System.out.println("==Items==");
for (Item lines : items)
System.out.println(lines);
输出:
Identifier? (empty will stop)
1234
Name? (empty will stop)
Test1
Identifier? (empty will stop)
1234
Name? (empty will stop)
Test2
Identifier? (empty will stop)
1234
Name? (empty will stop)
Test1
Identifier? (empty will stop)
5555
Name? (empty will stop)
Test3
Identifier? (empty will stop)
==Items==
1234: Test1
1234: Test2
5555: Test3
我的代码添加了除相同项目之外的所有内容,但我希望它也跳过相同的标识。我该怎么做? 可能有这么简单的方法,但我想不通。
【问题讨论】:
String
不是Item
。因此,检查 String
是否包含在 Item
s 列表中显然永远不会匹配。
我编辑了它,我粘贴了我的旧代码。再次检查,但我明白你的意思,我如何检查标识符是否在列表中?
你可以用items.stream().anyMatch(i -> i.identifier.equals(name));
代替contains
【参考方案1】:
你可以重写 Item 的 equals 方法,就像下面的代码:
@Override
public boolean equals(Object o)
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
return Objects.equals(identifier, item.identifier) ||
Objects.equals(name, item.name);
【讨论】:
【参考方案2】:您的列表包含一个Item
对象,其.getIdentifier()
方法将返回1234
。
当然,不是与字符串 1234
相同的东西,因此,contains
返回 false。
就像我在问你:嘿,这个苹果树的果园里有这幅苹果的画吗?当然不是:果园里没有画。
您必须自己遍历整个列表(编写 for 循环或使用流 API)进行检查。 Java 是面向对象的,因此对象具有“标识符”的概念不是一般原则。这是你的 Item
类有的东西,但其他类没有。
或者,如果您需要,您的 List<item>
可能不是正确的数据类型;也许这应该是一个将标识符映射到名称的Map<String, String>
。然后你可以简单地使用.containsKey
。
【讨论】:
以上是关于如何检查字符串是不是包含在 ArrayList 中?包含不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章