【问题标题】:Differences between contains and indexOf, JavaJava中contains和indexOf的区别
【发布时间】:2019-12-27 12:03:35
【问题描述】:

我正在做以下编程练习:The old switcheroo。声明是:

写一个函数

Kata.Vowel2Index("this is my string") == "th3s 6s my str15ng"

Kata.Vowel2Index("Codewars is the best site in the world") == "C2d4w6rs 10s th15 b18st s23t25 27n th32 w35rld"

您的函数应该对元音不区分大小写。

当输入是空字符串时我有疑问,我的意思是当我们测试时:

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class KataTest {
  @Test public void test4() {
    assertEquals("", Kata.vowel2Index(""));
  }
  
}

我的问题是,为什么如果我们使用包含,我们必须检查输入字符串是否为空?

import java.util.*;
public class Kata {
  static final String VOWELS = "AEIOUaeiou";
  public static String vowel2Index/*????➡️????*/(String s) {
    if(s==null || s.equals("")) return "";
    String[] letters = s.split("");
    
    for(int i = 0; i < letters.length; i++){
      if(VOWELS.contains(letters[i])){
        letters[i] = String.valueOf(i+1);
      }
    }
    return String.join("",letters);
  }
}

或者检查循环内的当前字符串是否为空:

import java.util.*;
public class Kata {
  static final String VOWELS = "AEIOUaeiou";
  public static String vowel2Index/*????➡️????*/(String s) {
    String[] letters = s.split("");
    
    for(int i = 0; i < letters.length; i++){
      if(letters[i] != "" && VOWELS.contains(letters[i])){
        letters[i] = String.valueOf(i+1);
      }
    }
    return String.join("",letters);
  }
}

但是我们在使用 indexOf 时可以省略前面的条件:

import java.util.*;
public class Kata {
  static final String VOWELS = "AEIOUaeiou";
  public static String vowel2Index/*????➡️????*/(String s) {
    String[] letters = s.split("");
    
    for(int i = 0; i < letters.length; i++){
      if(VOWELS.indexOf(letters[i]) > 0){
        letters[i] = String.valueOf(i+1);
      }
    }
    return String.join("",letters);
  }
}

我也看过:

contains 和 indexOf 有什么区别?‽?

【问题讨论】:

  • 一个返回一个布尔值,另一个返回一个整数值,仅此而已。视需要而定
  • contains 就是return indexOf(s.toString()) &gt; -1;

标签: java string if-statement replace substring


【解决方案1】:
contains()

当您想要检查特定字符串是否包含特定子字符串时,这是编程中的常见情况。例如,如果要测试字符串“The big red fox”是否包含子字符串“red”。这种方法在这种情况下很有用。

    String s1 = "My name is bar"; 
    System.out.println(s1.contains("bar")); 
    System.out.println(s1.contains("foo")); 

    //output
    true
    false

2..

indexOf()

此方法返回此字符串中指定字符第一次出现的索引,如果该字符未出现,则返回 -1。

    String gfg = new String("Welcome to stackoverflow"); 
    System.out.print("Found s first at position : ");  
    System.out.println(gfg.indexOf('s'));

   //output
   Found s first at position : 11

【讨论】:

    【解决方案2】:

    containsindexOf 的行为完全相同,它们具有相同的运行时间。 contains 定义为 indexOf(s.toString()) &gt; -1
    在空字符串"" 作为方法的输入的极端情况下,它们的行为方式显然是您意想不到的:它们返回0 / true。这意味着你的陈述

    VOWELS.contains(letters[i])
    letters[i] != "" && VOWELS.contains(letters[i])
    VOWELS.indexOf(letters[i]) > 0
    

    只是做不同的事情,并不等同。

    对于"",它们是truefalsefalse
    对于"A",它们是truetruefalse
    对于"B",它们是truetruetrue

    【讨论】:

    • indexOf(x) &gt; 0contains(x)相同。我知道这是问题中的复制/粘贴错误,但您已经显示了正确的代码,即indexOf(x) &gt; -1,或者indexOf(x) &gt;= 0
    • 您实际上并没有在任何地方这么说,您也没有解释为什么"A" 表现不佳。 --- 另外,letters[i] != "" 是错误代码,因为您不能使用 != 来比较字符串。
    【解决方案3】:

    indexOf 将返回一个 Integer,其中包含子字符串开始的索引,当子字符串不出现时返回 -1。

    contains 将返回一个布尔值,它是否包含子字符串。

    【讨论】:

    • 不,contains 不能更快,因为它只是调用 indexOf
    • 刚刚仔细检查 - 你是对的 - 我会更新我的答案。当时,当测试完成时,似乎使用了两种不同的算法,
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2022-11-25
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多