如何检查一个List<String>是否包含特定的字符串?

12

我想做的是: 我有一个List<String>,如果这个List包含特定的字符串,我想打印一条语句,否则抛出一个异常,但当我尝试以下代码时

List<String> fruit = new ArrayList<>();
fruit.add("apple");
fruit.add("orange");
fruit.add("banana");

for(int i = 0; i < fruit.size(); i++){
   if(fruit.get(i).contains("banana"){
     System.out.println("Found");
   } else {
     throw new SkipException("could not be found");
   }
}

它遍历列表,并且在 i = 0 的时候显然找到了“apple”并立即进入else块并抛出异常。我还尝试了以下方法,但这也没有起作用。

for(int i = 0; i < fruit.size(); i++){
   if(Arrays.asList(fruit).contains("banana"){
      System.out.println("found");
   }else{
      throw new SkipException("not found");
   }
}

有没有简单的方法可以完成我想做的事情?


请参考以下链接:https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#contains(java.lang.Object) - RamPrakash
你是想查找列表中是否包含字符串“banana”,还是查找列表中的任何字符串是否包含子字符串“banana”? - JimmyJames
@JimmyJames,我正在尝试查找列表中是否包含“banana”,而不是子字符串...如果有意义的话。 - DjShon
4个回答

25

有几种方法。

你选择哪一种取决于你,这里有一个权衡:详细度、如果你想进行更复杂的匹配,你不能轻松地使用Option 1中的简单等于检查(如果要进行更复杂的匹配,则无法轻松使用),以及使用可能还不支持或不熟悉的较新API。

选项1Collection.contains() 方法:

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("orange");
fruits.add("banana");

if (fruits.contains("banana") {
    System.out.println("Found");
} else {
    throw new SkipException("could not be found");
}

选项2:使用带有外部状态的 for 循环:

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("orange");
fruits.add("banana");

boolean found = false;
for (String s : fruits) {
    if (s.equals("banana")) {
        found = true;
        break; // Break out of the loop to skip the remaining items
    }
}
if (found) {
    System.out.println("Found");
} else {
    throw new SkipException("could not be found");
}

选项3: 如果您正在使用Java 8,则可以使用方便的Stream.anyMatch()方法:

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("orange");
fruits.add("banana");

if (fruits.stream().anyMatch(s -> s.equals("banana"))) {
    System.out.println("Found");
} else {
    throw new SkipException("could not be found");
}

选项3是我个人最喜欢的,因为它几乎和选项1一样紧凑,但如果您想基于除equals()方法之外的其他内容进行比较,则允许提供更复杂的Predicate


2

您不必遍历整个数组列表。一旦调用list.contains("someString"),它将在整个数组列表中检查该字符串。因此,以下内容已足够。

if(fruit.contains("banana"){
     System.out.println("Found");
} else {
     throw new SkipException("could not be found");
}

0
尝试使用以下代码,如果在任何索引处的值等于“banana”,它将打印“found”,否则它将抛出异常。
   List<String> fruit = new ArrayList<>();
   fruit.add("apple");
   fruit.add("orange");
   fruit.add("banana");

   boolean result;
   for(int i = 0; i < fruit.size(); i++){
      result = fruit.get(i).equals("banana");
      if(result){
        break; // Early exit if found
      }
   }

   if(result){
      System.out.println("Found");
   } else {
      throw new SkipException("could not be found");
   }

解决方案2: 在使用ArrayList时,您无需手动迭代每个索引,而是ArrayList提供了一个名为“contains()”的函数,将自动检查所需值是否存在于任何索引中,因此您可以简单地执行以下操作:
    if(fruit.contains("banana"){
         System.out.println("Found");
    } else {
         throw new SkipException("could not be found");
     }

因为这段代码的行为(对于给定的输入)与 OP 的解决方案完全一致,所以它被踩了。你的代码永远不会打印“Found”,因为遇到的第一个元素是“apple”,将错误地抛出异常。 - Craig Otis
谢谢指出,我希望第二个解决方案没问题。 - Syed Haris Ali Ghaznavi

-1
尝试使用布尔值来检测您是否在水果列表中找到了水果。类似这样的代码:
boolean inlist = false;

for(int i = 0; i < fruit.size(); i++){
   if(fruit.get(i).equals("banana"){
        inlist = true
        break;
   }
}

if (inlist) {
    System.out.println("found");
} else {
    throw new SkipException("not found");
}

我猜想:1. 这样使用布尔值是不好的风格。2. 你可以直接调用列表包含的方法。3. 即使你想循环,也应该使用foreach ":" 而不是在索引上循环。 - JimmyJames
@JimmyJames,你有参考资料说明为什么像这样使用布尔值被认为是“不好的风格”吗?我知道有特定的方法/工具来处理这种用例,但我只对你的#1评论感兴趣。 - RayfenWindspear
1
@RayfenWindspear 这有点主观,而且在评论中解释太长了。但是我的观点(也是似乎在SO上很受欢迎的观点)是,你应该把逻辑放在循环中的if语句里,并从那里返回。你使用的风格通常是学校教授的,但根据我所见,在行业中已经不再流行了。 - JimmyJames
那么你的意思是说,踩票者不喜欢风格?内容和正确性没有问题?如果是这样的话,那我就说踩票者先生/女士你太过分了! - MidasLefko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接