【问题标题】:seqSearchFunction(String s,char c)seqSearchFunction(String s,char c)
【发布时间】:2019-08-22 17:24:19
【问题描述】:

我正在尝试创建两个函数。一:如果 c 变量在 String 变量中至少出现一次,则显示为“真”。二:功能相同但显示字母的位置。更具体地说,seqSearchPos 函数 (String s, char c) 搜索 c 是否出现在 s 中。 如果存在,函数将 c 的位置返回给 s。如果 c 不存在,该函数将 返回 -1。

我很遗憾不知道如何解决这个问题,这个关于字符串和字符的具体问题。一定有一个我仍然不知道的方法可以帮助我解决这个问题

public static boolean seqSearch(String s, char c) {
       boolean found=false;
       if(s.equals(c)) {
           found=true;
       }
       return found;
   }

主要:

String s="e";
char c='e';
System.out.println(seqSearch(s,c));

public static int seqSearchPos(String s,char c) {
       int position=-1;
       for(int i=0; i<s.length(); i++) {
           if(s.equals(c)) {
               position=i;
               break;
           }
       }
       return position;
   }

主要:

String s="hello";
char c='e';
System.out.println(seqSearchPos(s,c));

我希望在第一个中显示 true,在第二个中显示位置 1 但它分别显示为 false 和 -1。

【问题讨论】:

  • 提示:它们是完全相同的方法,并且应该以相同的方式工作。唯一的区别是他们找到/找不到角色时返回的内容。

标签: java arrays string char


【解决方案1】:

这行代码有个bug:

if(s.equals(c)) {

它将整个字符串与字符进行比较,并且(显然)不匹配。

需要比较字符串中索引处的单个字符:

if (s.charAt(i) == c) {

顺便说一句,您也可以直接从if 语句中使用return。这将让您删除 position 变量并使代码更短:

public static int seqSearchPos(String s, char c) {
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == c) {
            return i;
        }
    }
    return -1;
}

还有一个 String.indexOf(int c) 方法可以完全满足您的需要,并且可以让您像这样编写方法:

public static int seqSearchPos(String s, char c) {
    return s.indexOf(c);
}

或者,更好的是,直接调用该 String 方法,而不是将其包装在您自己的函数中。

【讨论】:

  • 如果可以的话,能否请您用更简单的方式解释一下 String.indexOf() ?我似乎无法理解这一点,也无法理解 int indexOf(int ch)。
  • 在 Java 中,char 实际上是一个整数(0 到 65535),可以像分配给 int(范围更广)一样使用。 String.indexOf(int c) 方法采用int 而不是char,因此它可以处理现代Unicode 字符,例如将字符代码扩展到char 范围之外的表情符号。但是您仍然可以使用 char 调用该方法。
【解决方案2】:

您应该可以在这里找到答案: How can I check if a single character appears in a string?

其中一个答案还谈到了角色的位置。

他们基本上在做的是使用默认的字符串库,即: String.contains()String.indexOf()

【讨论】:

    【解决方案3】:

    实际上你正在尝试实现String类的contains(char)indexOf(char)方法。

    您正在将整个字符串与单个字符进行比较。如果字符串的长度不是 1,则您的方法将始终返回 false。要纠正此问题,您应该迭代字符串的每个字符。您可以使用 == 运算符比较两个字符。

    public static boolean seqSearch(String s, char c) {
       boolean found=false;
       for(int i=0;i<s.length();i++){
         if(s.charAt(i)==c) {
            found=true;
         }
       }
       return found;
    

    }

    第二个问题也存在同样的问题,你应该比较每个字符。

    public static int seqSearchPos(String s,char c) {
       int position=-1;
       for(int i=0; i<s.length(); i++) {
           if(s.charAt(i)==c) {
               position=i;
               break;
           }
       }
       return position;
    

    }

    【讨论】:

      【解决方案4】:

      正如其他人指出的那样,您的问题是您将整个字符串 s 与始终为假的字符 c 进行比较。

      以下是使用 Java Streams 的两个方法实现:

      public static boolean seqSearch(String string, char character) {
          return string.chars().anyMatch(c -> c == character);
      }
      

      这会创建一个 IntStream,其中包含所有返回 true 的字符(如果其中任何一个为 true)。

      public static int seqSearchPos(String string, char character) {
          return IntStream.range(0, string.length())
                  .filter(i -> string.charAt(i) == character)
                  .findFirst()
                  .orElse(-1);
      }
      

      在这里,您创建一个从0n - 1IntStream,如果找到该字符,则返回第一个索引。如果不是,则返回-1

      除此之外,您还可以使用本机 String.indexOf() 方法,这正是您想要的:

      public static int seqSearchPos(String string, char character) {
          return string.indexOf(character);
      }
      

      您也可以将此方法用于您的seqSearch() 方法:

      public static boolean seqSearch(String string, char character) {
          return string.indexOf(character) >= 0;
      }
      

      或者,您可以使用本机 String.contains() 方法来实现:

      public static boolean seqSearch(String string, char character) {
          return string.contains(String.valueOf(character));
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多