如何检查字符串中是否出现单个字符?


209

在Java中,有一种检查条件的方法:

“此单个字符是否完全出现在字符串x中”

使用循环?


4
您是否有避免循环的特定原因?
shsteimer 2009年

2
您无法不循环就无法对字符进行常规搜索。查找图灵机的工作方式。
萨尔瓦多·瓦伦西亚

4
我们应该假设@barfoon不希望循环出现在他们的代码中。显然,机器在某处循环。否则,这个问题是胡说八道。
WW。

我会说Java的字符串操作非常有限
ACV

Answers:


276

您可以使用string.indexOf('a')

如果该字符a存在于string

它返回此对象表示的字符序列中该字符首次出现的索引,如果未出现该字符,则返回-1。


8
但是在该调用之后总会有一个循环,因为否则您将找不到符号。
vava

4
indexOf()在内部使用循环。
mmcdole,2009年

22
那不是Barfoon问的。B希望避免在B的代码中进行循环。自然,API毕竟需要做一个循环,毕竟String是一个包含有许多有用方法的漂亮类中包裹的字符数组。
mP。

5
这些答案如何获得如此多的赞誉?indexOf()使用use 的解决方案在内部循环。没有一个答案能给出正确的解决方案,如果有人敢问一个新问题,人们就会宣布Duplicate。真让人失望;(
Prashant Prabhakar Singh

4
@PrashantPrabhakarSingh我看不出没有循环怎么办。字符串或多或少是一组字符。如果它是一个组(集合,数组等),那么无论它是本机代码的内部还是外部,我都希望您需要一个循环才能在“组”中查找内容。我相信“不使用循环?” 更像是“不编写自己的循环?”。
泰勒

144
  • String.contains() 检查字符串是否包含指定的char值序列
  • String.indexOf() 它返回指定字符或子字符串首次出现在字符串中的索引(此方法有4种变化)

15
char不是CharSequence,因此无法将其传递给String.contains(CharSequence)。
mP。

28
要将String.contains()与单个字符c一起使用,请执行以下操作:String.contains(Character.toString(c))
friederbluemle 2012年

7
或者,如果您喜欢短代码,请执行以下操作:String.contains(""+c)
Felix Neumeyer

31

我不确定原始海报到底在问什么。由于indexOf(...)和contains(...)都可能在内部使用循环,也许他正在寻找是否可以在没有循环的情况下实现?我可以想到两种方法,其中一种当然是复发:

public boolean containsChar(String s, char search) {
    if (s.length() == 0)
        return false;
    else
        return s.charAt(0) == search || containsChar(s.substring(1), search);
}

另一个远不那么优雅,但是完整性...:

/**
 * Works for strings of up to 5 characters
 */
public boolean containsChar(String s, char search) {
    if (s.length() > 5) throw IllegalArgumentException();

    try {
        if (s.charAt(0) == search) return true;
        if (s.charAt(1) == search) return true;
        if (s.charAt(2) == search) return true;
        if (s.charAt(3) == search) return true;
        if (s.charAt(4) == search) return true;
    } catch (IndexOutOfBoundsException e) {
        // this should never happen...
        return false;
    }
    return false;
}

当然,随着您需要支持越来越长的字符串,行数会增加。但是根本没有循环/重复。如果您担心length()使用循环,甚至可以删除长度检查。


10
如果将递归定义为非循环过程,则您是极富创意的极客:D +1。
guerda

1
对于5的硬编码长度来说,这一切都很好。否则,需要循环搜索字符。并不是书呆子,而是图灵机的定义证明了这一点。计算设备的基础。
萨尔瓦多·瓦伦西亚

4
如果我错了,请纠正我,直到一天结束,递归都是变相的循环,不是吗?在某些情况下,它可能导致比普通循环更多的内存消耗。
PasinduJay'17年

12
String temp = "abcdefghi";
if(temp.indexOf("b")!=-1)
{
   System.out.println("there is 'b' in temp string");
}
else
{
   System.out.println("there is no 'b' in temp string");
}

1
这是否与接受的答案完全相同?,我们感谢您的努力,但您应该尝试找到一些未回答的问题并回答。
Shekhar_Pro 2011年

7

您可以使用String该类中的2种方法。

  • String.contains() 检查字符串是否包含指定的char值序列
  • String.indexOf() 它返回指定字符或子字符串首次出现的字符串中的索引,如果找不到该字符,则返回-1(此方法有4个变体)

方法1:

String myString = "foobar";
if (myString.contains("x") {
    // Do something.
}

方法2:

String myString = "foobar";
if (myString.indexOf("x") >= 0 {
    // Do something.
}

链接:Zach Scrivena


4

要检查字符串中是否不存在某些字符,您至少需要查看字符串中的每个字符。因此,即使您没有显式使用循环,它也会具有相同的效率。话虽如此,您可以尝试使用str.contains(“” + char)。


同意 在某个时候,某个地方的某人需要构造一个循环来执行此操作。幸运的是,Java API可以做到这一点,否则我们的代码将非常混乱!
Fortyrunner

4

如果需要经常检查相同的字符串,则可以预先计算字符出现的次数。这是一个使用长数组中包含的位数组的实现:

public class FastCharacterInStringChecker implements Serializable {
private static final long serialVersionUID = 1L;

private final long[] l = new long[1024]; // 65536 / 64 = 1024

public FastCharacterInStringChecker(final String string) {
    for (final char c: string.toCharArray()) {
        final int index = c >> 6;
        final int value = c - (index << 6);
        l[index] |= 1L << value;
    }
}

public boolean contains(final char c) {
    final int index = c >> 6; // c / 64
    final int value = c - (index << 6); // c - (index * 64)
    return (l[index] & (1L << value)) != 0;
}}

我在遇到类似问题时尝试了您的解决方案。对于字符串1长度63k和字符串2长度95k,我最接近的解决方案是1500毫秒以上。您的解决方案会在3-5毫秒内吐出结果。您能否编辑您的解决方案以包含说明?请?
Viorel Florian


1
package com;
public class _index {

    public static void main(String[] args) {
        String s1="be proud to be an indian";
        char ch=s1.charAt(s1.indexOf('e'));
        int count = 0; 
        for(int i=0;i<s1.length();i++) {
            if(s1.charAt(i)=='e'){
                System.out.println("number of E:=="+ch);
                count++;
            }
        }
        System.out.println("Total count of E:=="+count);
    }
}

2
for不是一个循环呢?
2014年

0
String s="praveen";
boolean p=s.contains("s");
if(p)
    System.out.println("string contains the char 's'");
else
    System.out.println("string does not contains the char 's'");

输出量

string does not contains the char 's'

之前已经提供了相同的答案。
Serge Belov,2012年

0
static String removeOccurences(String a, String b)
{
    StringBuilder s2 = new StringBuilder(a);

    for(int i=0;i<b.length();i++){
        char ch = b.charAt(i);  
        System.out.println(ch+"  first index"+a.indexOf(ch));

        int lastind = a.lastIndexOf(ch);

    for(int k=new String(s2).indexOf(ch);k > 0;k=new String(s2).indexOf(ch)){
            if(s2.charAt(k) == ch){
                s2.deleteCharAt(k);
        System.out.println("val of s2 :             "+s2.toString());
            }
        }
      }

    System.out.println(s1.toString());

    return (s1.toString());
}

在这里,我们要寻找出现在字符串a中的字符串b中每个字符的出现并删除这些字符。
Ganeshmani 2012年

0
you can use this code. It will check the char is present or not. If it is present then the return value is >= 0 otherwise it's -1. Here I am printing alphabets that is not present in the input.

import java.util.Scanner;

public class Test {

public static void letters()
{
    System.out.println("Enter input char");
    Scanner sc = new Scanner(System.in);
    String input = sc.next();
    System.out.println("Output : ");
    for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
            if(input.toUpperCase().indexOf(alphabet) < 0) 
                System.out.print(alphabet + " ");
    }
}
public static void main(String[] args) {
    letters();
}

}

//Ouput Example
Enter input char
nandu
Output : 
B C E F G H I J K L M O P Q R S T V W X Y Z

0

以下是您要找的东西吗?

int index = string.indexOf(character);
return index != -1 && string.lastIndexOf(character) != index;

为什么拥有 && string.lastIndexOf(character) != index
GreenAsJade

-1

一旦使用循环/递归,您将无法检查char是否完全出现在某个字符串中,而不会至少遍历该字符串(诸如indexOf之类的内置方法也使用一个循环)

如果没有。您查找字符串中的字符x的次数比我使用Set数据结构所建议的长度要多得多,因为这比简单地使用set数据结构更有效indexOf

String s = "abc";

// Build a set so we can check if character exists in constant time O(1)
Set<Character> set = new HashSet<>();
int len = s.length();
for(int i = 0; i < len; i++) set.add(s.charAt(i));

// Now we can check without the need of a loop
// contains method of set doesn't use a loop unlike string's contains method
set.contains('a') // true
set.contains('z') // false

使用set,您将能够在恒定时间 O(1)中检查字符是否存在于字符串中,但是您还将使用额外的内存(空间复杂度为O(n))。


-3

我为此使用了string.includes()方法,如果找到了字符串或字符,该方法将返回true或false。请参阅以下文档。

https://www.w3schools.com/jsref/jsref_includes.asp


尽管此链接可以回答问题,但最好在此处包括答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。
阿德里亚诺·马丁斯

2
这个答案是针对JavaScript的,这个问题在Java中特别提到
Hazem Farahat

-4

//这只是主要...您可以使用带缓冲的阅读器或扫描仪

string s;
int l=s.length();
int f=0;
for(int i=0;i<l;i++)
   {
      char ch1=s.charAt(i); 
      for(int j=0;j<l;j++)
         {
          char ch2=charAt(j);
          if(ch1==ch2)
           {
             f=f+1;
             s.replace(ch2,'');
           }
          f=0;
          }
     }
//if replacing with null does not work then make it space by using ' ' and add a if condition on top.. checking if its space if not then only perform the inner loop... 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.