顺序查找函数(String s,char c)

4
我正在尝试创建两个函数。第一个函数用于判断String变量中是否至少出现过一次变量c,若是则返回“true”。第二个函数也是相同的功能,但需要返回变量c在字符串中的位置。具体来说,seqSearchPos函数(String s, char c)会搜索变量c是否出现在s中。如果c存在,则该函数将返回其在s中的位置;如果不存在,则返回-1。
很遗憾,我不知道如何解决这个问题,特别是涉及到String和char的问题。可能还有我不知道的方法能够帮助我解决这个问题。
public static boolean seqSearch(String s, char c) {
       boolean found=false;
       if(s.equals(c)) {
           found=true;
       }
       return found;
   }

Main:

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;
   }

Main:

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

我原以为第一个会显示真,第二个会显示位置 1,但它们分别显示假和-1。


1
提示:它们是完全相同的方法,应该以相同的方式工作。唯一的区别是当它们找到/未找到字符时返回什么。 - RealSkeptic
4个回答

2

There is a bug in this line of code:

if(s.equals(c)) {

"最初的回答":它正在将整个字符串与字符进行比较,而且(显然)不匹配。您需要比较字符串中索引处的单个字符。
if (s.charAt(i) == c) {

顺便说一下,你也可以直接在if语句中使用return。这样可以省去position变量,并使代码更短:

return
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.indexOf()吗?我似乎无法理解它或int indexOf(int ch)。 - Patsakr
1
在Java中,char实际上是一个整数(0到65535),可以像int一样使用和赋值(其范围更广)。String.indexOf(int c)方法采用int而不是char,以便处理现代Unicode字符,如超出char边界的笑脸。但您仍然可以使用char调用该方法。 - ᴇʟᴇvᴀтᴇ

1

1

实际上,您正在尝试实现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;

}


0

正如其他人指出的那样,您的问题在于将整个字符串s与字符c进行比较,这总是错误的。

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

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

这将创建一个IntStream,其中包含所有字符,如果其中任何一个为真,则返回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-1创建一个IntStream,并在找到字符后返回第一个索引。如果没有找到,则返回-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));
}

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