文字列に単一の文字が含まれているかどうかを確認するにはどうすればよいですか?


210

Javaには状態をチェックする方法があります:

「この1文字が文字列xに表示されますか」

ループを使わずに


4
ループを回避しようとする特別な理由はありますか?
shsteimer 2009

2
ループなしでは、文字の一般的な検索を行うことはできません。チューリングマシンの動作を調べます。
サルバドールバレンシア

4
@barfoonがループをコードに含めたくないと想定する必要があります。明らかに、マシンはどこかでループします。そうでなければ問題はナンセンスです。
WW。

私はJavaの文字列操作がかなり制限されていると思います
ACV

回答:


276

使用できますstring.indexOf('a')

char aが次の場所にある場合string

このオブジェクトで表される文字シーケンスで最初に出現する文字のインデックスを返します。文字が出現しない場合は-1を返します。


8
しかし、そうでなければシンボルを見つけることができないため、その呼び出しの後ろには常にループがあります。
vava

4
indexOf()は内部的にループを使用します。
mmcdole 2009

22
それはBarfoonが尋ねたことではありません。Bは、Bのコードでループを実行したくないと考えています。当然のことながら、すべての文字列が多くの便利なメソッドを持つ素敵なクラスにラップされた文字の配列である場合、APIはループを行う必要があります。
mP。

5
これらの回答はどのようにして多くの賛成票を得ていますか?使用のソリューションは、indexOf()内部的にループを使用します。答えはどれも正しい解決策を与えず、誰かがあえて新しい質問をする場合、人々はそれを宣言しDuplicateます。本当にがっかり;(
Prashant Prabhakar Singh

4
@PrashantPrabhakarSinghループなしでこれを実行する方法がわかりません。文字列は多かれ少なかれ文字のグループです。それがグループ(コレクション、配列など)である場合、ネイティブコードの内部または外部に関係なく、「グループ」内で何かを見つけるためにループが必要になると思います。「ループを使わずに?」「自分のループを書かずに」のようなものです。
タイラー

145
  • String.contains() 文字列に指定されたchar値のシーケンスが含まれているかどうかを確認します
  • String.indexOf() 指定された文字または部分文字列が最初に出現する文字列内のインデックスを返します(このメソッドには4つのバリエーションがあります)

15
charはCharSequenceではないため、String.contains(CharSequence)に渡すことはできません。
mP。

28
1つの文字cでString.contains()を使用するには、次のようにします
。String.contains

7
:あなたのショートコードのような場合は、これを行うString.contains(""+c)
フェリックスNeumeyer

31

オリジナルのポスターが正確に何を求めているのかわかりません。indexOf(...)とcontains(...)の両方から、おそらく、おそらく彼は、これはループせずにすべての可能性であるかどうかを確認するために探している、内部ループを使用できますか?私は2つの方法を考えることができます。1つはもちろん再帰です。

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

もう1つはエレガントではありませんが、完全性...:

/**
 * 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です。
ゲルダ

1
ハードコードされた長さ5の場合はすべて問題ありません。それ以外の場合は、文字を検索するためにループを実行する必要があります。独断的ではありませんが、これの証拠は、チューリングマシンの定義によって示されます。計算デバイスの基礎。
サルバドールバレンシア

4
私が間違っている場合は私を修正してください、一日の終わりに感じます、再帰は変装のループではありませんか?また、一部のシナリオでは、通常のループよりも多くのメモリを消費する可能性があります。
PasinduJay 2017年

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

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 2009

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

私が持っている同様の問題であなたの解決策を試しました。私の最も近い解決策は、string1の長さが63k、string2の長さが95kの場合、1500ミリ秒を超えていました。ソリューションは3〜5ミリ秒で結果を吐き出します。説明を含めるためにソリューションを編集していただけますか?お願いします?
Viorel Florian 2017


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'

同じ答えが以前に提供されています。
セルジュベロフ

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

ループ/再帰を使用して文字列を少なくとも一度通過しないと、文字列に文字が表示されるかどうかを確認できません(indexOfなどの組み込みメソッドもループを使用します)

いいえ。文字が文字列xにあるかどうかを調べる場合は、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


このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
Adriano Martins

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... 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.