문자열에 단일 문자가 나타나는지 어떻게 확인할 수 있습니까?


210

Java에는 조건을 확인하는 방법이 있습니다.

"이 단일 문자가 문자열 x에 전혀 표시됩니까?"

루프 사용 하지 않고 ?


4
루프를 피하려는 특별한 이유가 있습니까?
shsteimer

2
루프없이 문자를 일반 검색 할 수 없습니다. 튜링 머신의 작동 방식을 확인하십시오.
살바도르 발렌시아

4
우리는 @barfoon이 ​​루프가 코드에 있기를 원하지 않는다고 가정해야합니다. 분명히 기계는 어딘가에서 루프를 수행합니다. 그렇지 않으면 질문은 말도 안됩니다.
WW.

나는 자바의 문자열 조작이 상당히 제한되어 있다고 말할 것이다
ACV

답변:


276

사용할 수 있습니다 string.indexOf('a').

문자 a가 다음에있는 경우 string:

이 객체가 나타내는 문자 순서에서 문자가 처음 나타나는 색인을 반환하거나 문자가 발생하지 않으면 -1을 반환합니다.


8
그러나 그렇지 않으면 기호를 찾을 수 없으므로 항상 호출 뒤에 루프가 있습니다.
vava

4
indexOf ()는 내부적으로 루프를 사용합니다.
mmcdole

22
바푼이 요구 한 것은 아닙니다. B는 B의 코드에서 루프를 수행하지 않기를 원합니다. 당연히 API는 많은 유용한 메소드로 멋진 클래스에 싸인 문자 배열 인 후에 루프를 수행해야합니다.
mP.

5
이 답변은 어떻게 많은 찬사를 받고 있습니까? 사용 솔루션은 indexOf()내부적으로 루프 를 사용합니다. 어떤 대답도 올바른 해결책을 제시하지 않으며 누군가가 새로운 질문을 감히하면 사람들은 그것을 선언합니다 Duplicate. 정말 실망; (
Prashant Prabhakar Singh

4
@PrashantPrabhakarSingh 루프 없이이 작업을 수행하는 방법을 모르겠습니다. 문자열은 문자 그룹입니다. 그룹 (컬렉션, 배열 등) 인 경우 네이티브 코드의 내부 또는 외부에 관계없이 "그룹"에서 무언가를 찾으려면 루프가 필요할 것으로 예상합니다. 나는 "루프를 사용하지 않고?" "내 자신의 루프를 작성하지 않고?"
Tyler

145
  • String.contains() 문자열에 지정된 문자 값 시퀀스가 ​​포함되어 있는지 확인합니다.
  • String.indexOf() 지정된 문자 또는 하위 문자열이 처음 나타나는 문자열 내에서 색인을 반환합니다 (이 방법에는 4 가지 변형이 있음)

15
char은 CharSequence가 아니므로 String.contains (CharSequence)에 전달할 수 없습니다.
mP.

28
단일 문자 c와 함께 String.contains ()를 사용하려면 다음과 같이하십시오. String.contains (Character.toString (c))
friederbluemle

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에 모두 적합합니다. 그렇지 않으면 문자를 검색하기 위해 루프를 수행해야합니다. pedantic이 아니라 이것의 증거는 Turing Machine의 정의에 의해 보여집니다. 전산 장치의 기초.
살바도르 발렌시아

4
내가 틀렸다면 날 고쳐줘, 나는 하루가 끝날 때 느낀다. 그리고 일부 시나리오에서는 일반 루프보다 더 많은 메모리를 소비 할 수 있습니다.
PasinduJay

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() 문자열에 지정된 문자 값 시퀀스가 ​​포함되어 있는지 확인합니다.
  • 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;
}}

나는 비슷한 문제에 대한 해결책을 시도했다. 가장 가까운 솔루션은 string1 length 63k 및 string2 length 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지금 루프가 아니십니까?
Mindwin

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

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

여기서 우리는 String a에있는 String b의 모든 문자를 찾고 문자를 삭제합니다.
Ganeshmani

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
있는가

-1

루프 / 재귀를 사용하여 문자열을 한 번 이상 살펴 보지 않고 char이 일부 문자열에 전혀 나타나지 않는지 확인할 수 없습니다 (indexOf와 같은 내장 메소드는 루프 사용)

그렇지 않다면. char이 문자열 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

문자열 또는 문자가 발견되면 true 또는 false를 반환하는 string.includes () 메서드를 사용했습니다. 아래 문서를 참조하십시오.

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.