Hoe kan ik controleren of een enkel teken in een tekenreeks voorkomt?

In Java is er een manier om de voorwaarde te controleren:

“Komt dit enkele teken überhaupt voor in string x”

zondereen lus te gebruiken?


Antwoord 1, autoriteit 100%

U kunt string.indexOf('a').

Als het teken aaanwezig is in String:

het retourneert de index van het eerste voorkomen van het teken in
de tekenreeks die door dit object wordt vertegenwoordigd, of -1 als de
teken komt niet voor.


Antwoord 2, autoriteit 50%

  • String.contains()die controleert of de string een gespecificeerde reeks char-waarden bevat
  • String.indexOf()die de index retourneert binnen de tekenreeks van het eerste voorkomen van het opgegeven teken of subtekenreeks (er zijn 4 varianten van deze methode)

Antwoord 3, autoriteit 12%

Ik weet niet zeker wat de originele poster precies vraagt. Aangezien indexOf(…) en bevat(…) beide waarschijnlijklussen intern gebruiken, wil hij misschien zien of dit überhaupt mogelijk is zonder een lus? Ik kan twee manieren bedenken, de ene zou natuurlijk recursie zijn:

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

De andere is veel minder elegant, maar volledigheid…:

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

Het aantal regels groeit naarmate je natuurlijk langere en langere strings moet ondersteunen. Maar er zijn helemaal geen lussen/recurrsies. Je kunt zelfs de lengtecontrole verwijderen als je bang bent dat die lengte() een lus gebruikt.


Antwoord 4, autoriteit 4%

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

Antwoord 5, autoriteit 4%

U kunt 2 methoden uit de klasse Stringgebruiken.

  • String.contains()die controleert of de string een gespecificeerde reeks char-waarden bevat
  • String.indexOf()die de index binnen de tekenreeks van het eerste voorkomen van het opgegeven teken of subtekenreeks retourneert of -1 retourneert als het teken niet wordt gevonden (er zijn 4 variaties van deze methode)

Methode 1:

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

Methode 2:

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

Links door: Zach Scrivena


Antwoord 6, autoriteit 2%

Als u dezelfde tekenreeks vaak moet controleren, kunt u vooraf berekenen hoeveel tekens er voorkomen. Dit is een implementatie die een bit-array gebruikt in een lange array:

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

Antwoord 7

Om te controleren of iets niet in een string voorkomt, moet je op zijn minst naar elk teken in een string kijken. Dus zelfs als u niet expliciet een lus gebruikt, heeft deze dezelfde efficiëntie. Dat gezegd hebbende, je kunt proberen str.contains(“”+char) te gebruiken.


Antwoord 8

Ja, met de methode indexOf() voor de klasse string. Zie de API-documentatie voor deze methode


Antwoord 9

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

Antwoord 10

Is het onderstaande wat u zocht?

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

Antwoord 11

Als je de broncode van indexOfin JAVA ziet:

public int indexOf(int ch, int fromIndex) {
        final int max = value.length;
        if (fromIndex < 0) {
            fromIndex = 0;
        } else if (fromIndex >= max) {
            // Note: fromIndex might be near -1>>>1.
            return -1;
        }
        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
            // handle most cases here (ch is a BMP code point or a
            // negative value (invalid code point))
            final char[] value = this.value;
            for (int i = fromIndex; i < max; i++) {
                if (value[i] == ch) {
                    return i;
                }
            }
            return -1;
        } else {
            return indexOfSupplementary(ch, fromIndex);
        }
    }

je kunt zien dat het een for-lus gebruikt om een teken te vinden. Merk op dat elke indexOfdie u in uw code mag gebruiken, gelijk is aan één lus.

Het is dus onvermijdelijk om een lus te gebruiken voor een enkel teken.

Als je echter een speciale tekenreeks met meer verschillende vormen wilt vinden, gebruik dan handige bibliotheken zoals util.regex, het gebruikt een sterker algoritme om een teken of een tekenreekspatroon te matchen met Reguliere expressies. Bijvoorbeeld om een e-mail in een string te vinden:

String regex = "^(.+)@(.+)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(email);

Als je niet graag regex gebruikt, gebruik dan gewoon een lus en charAten probeer alle gevallen in één lus te behandelen.

Let op: recursieve methoden hebben meer overhead dan lus, dus het wordt niet aanbevolen.


Antwoord 12

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

Antwoord 13

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

Antwoord 14

Je kunt niet controleren of char in een string voorkomt zonder de string tenminste één keer te passeren met lus / recursie (de ingebouwde methoden zoals indexOf gebruiken ook een lus)

Als het nr. van de keren dat je opzoekt of een char in string xstaat, is meer dan de lengte van de string dan ik zou aanraden om een Stelde gegevensstructuur in, aangezien dat efficiënter zou zijn dan simpelweg 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 GEBRUIKEN U kunt controleren of het karakter in een tekenreeks bestaat in constante tijd o (1), maar u gebruikt ook extra geheugen (Ruimtecomplexiteit zal O (n)).

Other episodes