Wie kann ich überprüfen, ob ein einzelnes Zeichen in einer Zeichenfolge angezeigt wird?


208

In Java gibt es eine Möglichkeit, den Zustand zu überprüfen:

"Erscheint dieses einzelne Zeichen überhaupt in Zeichenfolge x?"

ohne Schleife?


4
Gibt es einen bestimmten Grund, warum Sie versuchen, Schleifen zu vermeiden?
Shsteimer

2
Sie können keine allgemeine Suche nach dem Zeichen ohne Schleife durchführen. Schauen Sie nach, wie eine Turingmaschine funktioniert.
Salvador Valencia

4
Wir sollten annehmen, dass @barfoon nicht möchte, dass sich die Schleife in ihrem Code befindet. Offensichtlich macht die Maschine irgendwo eine Schleife. Ansonsten ist die Frage Unsinn.
WW.

Ich würde sagen, dass die String-Manipulation von Java ziemlich begrenzt ist
ACV

Antworten:


274

Sie können verwenden string.indexOf('a').

Wenn das Zeichen avorhanden ist in string:

Es gibt den Index des ersten Auftretens des Zeichens in der durch dieses Objekt dargestellten Zeichenfolge zurück oder -1, wenn das Zeichen nicht vorkommt.


8
Hinter diesem Aufruf befindet sich jedoch immer eine Schleife, da Sie sonst kein Symbol finden können.
Vava

4
indexOf () verwendet intern eine Schleife.
mmcdole

22
Das hat Barfoon nicht gefragt. B möchte vermeiden, die Schleife im Code von B auszuführen. Natürlich muss die API eine Schleife ausführen, schließlich ist ein String ein Array von Zeichen, die in einer schönen Klasse mit vielen nützlichen Methoden zusammengefasst sind.
mP.

5
Wie bekommen diese Antworten so viele positive Stimmen? Die Lösungen der Verwendung indexOf()verwendet intern Schleife. Keine der Antworten gibt die richtige Lösung und wenn jemand es wagt, eine neue Frage zu stellen, erklären die Leute sie Duplicate. Wirklich enttäuschend; (
Prashant Prabhakar Singh

4
@PrashantPrabhakarSingh Ich sehe nicht, wie dies ohne eine Schleife gemacht werden kann. Eine Zeichenfolge ist mehr oder weniger eine Gruppe von Zeichen. Wenn es sich um eine Gruppe handelt (Sammlung, Array usw.), würde ich erwarten, dass Sie eine Schleife benötigen, um etwas innerhalb der "Gruppe" zu finden, unabhängig davon, ob es sich um internen oder externen Code handelt. Ich glaube "ohne eine Schleife zu benutzen?" ist eher wie "ohne meine eigene Schleife zu schreiben?".
Tyler

144
  • String.contains() Hiermit wird überprüft, ob die Zeichenfolge eine bestimmte Folge von Zeichenwerten enthält
  • String.indexOf() Dies gibt den Index innerhalb der Zeichenfolge des ersten Auftretens des angegebenen Zeichens oder Teilstrings zurück (es gibt 4 Variationen dieser Methode).

15
Ein Zeichen ist keine CharSequence, daher kann es nicht an String.contains (CharSequence) übergeben werden.
mP.

28
Um String.contains () mit einem einzelnen Zeichen zu verwenden, gehen Sie wie folgt vor: String.contains (Character.toString (c))
friederbluemle

7
Oder tun Sie dies, wenn Sie Funktionscode mögen:String.contains(""+c)
Felix Neumeyer

31

Ich bin mir nicht sicher, was das Originalplakat genau verlangt. Da indexOf (...) und enthält (...) wahrscheinlich beide intern Schleifen verwenden, möchte er vielleicht sehen, ob dies überhaupt ohne Schleife möglich ist? Ich kann mir zwei Möglichkeiten vorstellen, eine wäre natürlich eine Wiederholung:

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

Der andere ist weit weniger elegant, aber die Vollständigkeit ...:

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

Die Anzahl der Zeilen wächst, da Sie natürlich immer längere Zeichenfolgen unterstützen müssen. Es gibt jedoch überhaupt keine Schleifen / Wiederholungen. Sie können die Längenprüfung sogar entfernen, wenn Sie befürchten, dass diese Länge () eine Schleife verwendet.


10
Wenn Sie Rekursion als Nicht-Loop-Prozedur definieren, sind Sie ein Geek: D +1 für Kreativität.
Guerda

1
Es ist alles gut für die fest codierte Länge von 5. Andernfalls muss eine Schleife durchgeführt werden, um nach dem Charakter zu suchen. Nicht um pedantisch zu sein, aber der Beweis dafür ist die Definition einer Turingmaschine. Die Grundlage eines Rechengeräts.
Salvador Valencia

4
Korrigieren Sie mich, wenn ich falsch liege. Ich habe am Ende des Tages das Gefühl, dass eine Rekursion eine verschleierte Schleife ist, nicht wahr? In einigen Szenarien kann dies zu einem höheren Speicherverbrauch führen als eine normale Schleife.
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
Ist dies nicht das genaue Duplikat der akzeptierten Antwort? Wir bestätigen Ihre Bemühungen, aber Sie sollten versuchen, eine unbeantwortete Frage zu finden und sie zu beantworten.
Shekhar_Pro

7

Sie können 2 Methoden aus der StringKlasse verwenden.

  • String.contains() Hiermit wird überprüft, ob die Zeichenfolge eine bestimmte Folge von Zeichenwerten enthält
  • String.indexOf() Dies gibt den Index innerhalb der Zeichenfolge des ersten Auftretens des angegebenen Zeichens oder Teilstrings zurück oder gibt -1 zurück, wenn das Zeichen nicht gefunden wird (es gibt 4 Variationen dieser 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 von: Zach Scrivena


4

Um zu überprüfen, ob in einer Zeichenfolge etwas nicht vorhanden ist, müssen Sie sich zumindest jedes Zeichen in einer Zeichenfolge ansehen. Selbst wenn Sie eine Schleife nicht explizit verwenden, hat sie die gleiche Effizienz. Davon abgesehen können Sie versuchen, str.contains ("" + char) zu verwenden.


Einverstanden. Irgendwann muss jemand irgendwo eine Schleife erstellen, um dies zu tun. Glücklicherweise macht die Java-API dies oder unser Code wäre sehr überladen!
Fortyrunner

4

Wenn Sie dieselbe Zeichenfolge häufig überprüfen müssen, können Sie die Zeichenvorkommen im Voraus berechnen. Dies ist eine Implementierung, die ein Bit-Array verwendet, das in einem langen Array enthalten ist:

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

Ich habe Ihre Lösung für ein ähnliches Problem versucht, das ich habe. Meine nächste Lösung war über 1500 Millisekunden für String1 Länge 63k und String2 Länge 95k. Ihre Lösung spuckt ein Ergebnis in 3-5 Millisekunden aus. Können Sie bitte Ihre Lösung so bearbeiten, dass sie eine Erklärung enthält? Bitte?
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
und forist jetzt keine Schleife?
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'");

Ausgabe

string does not contains the char 's'

Die gleiche Antwort wurde bereits zuvor gegeben.
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());
}

Hier suchen wir nach Vorkommen aller Zeichen aus String b, die in String a vorhanden sind, und löschen die Zeichen.
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

Ist das unten, wonach Sie gesucht haben?

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

Warum haben Sie && string.lastIndexOf(character) != index
GreenAsJade

-1

Sie können nicht überprüfen, ob char in einer Zeichenfolge überhaupt angezeigt wird, ohne die Zeichenfolge mindestens einmal mit loop / recursion zu durchlaufen (die integrierten Methoden wie indexOf verwenden auch eine Schleife).

Wenn die Nr. Wenn Sie nachsehen, ob sich ein Zeichen in der Zeichenfolge x befindet, ist dies mehr als die Länge der Zeichenfolge, als ich die Verwendung einer Set- Datenstruktur empfehlen würde, da dies effizienter wäre als die einfache VerwendungindexOf

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

Mit set können Sie überprüfen, ob das Zeichen in einer Zeichenfolge in konstanter Zeit O (1) vorhanden ist, aber Sie verwenden auch zusätzlichen Speicher (die Raumkomplexität beträgt O (n)).


-3

Ich habe dafür die Methode string.includes () verwendet, die true oder false zurückgibt, wenn die Zeichenfolge oder das Zeichen gefunden wird. Siehe die folgende Dokumentation.

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


Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Adriano Martins

2
Diese Antwort ist für JavaScript, die Frage speziell in Java
Hazem Farahat

-4

// Dies ist nur die Hauptsache ... Sie können einen gepufferten Leser oder Scanner verwenden

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... 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.