Em Java, há uma maneira de verificar a condição:
"Esse caractere único aparece na string x"
sem usar um loop?
Em Java, há uma maneira de verificar a condição:
"Esse caractere único aparece na string x"
sem usar um loop?
Respostas:
Você pode usar string.indexOf('a')
.
Se o caractere a
estiver presente em string
:
retorna o índice da primeira ocorrência do caractere na sequência de caracteres representada por esse objeto ou -1 se o caractere não ocorrer.
indexOf()
usam loop internamente. Nenhuma das respostas fornece a solução correta e, se alguém se atreve a fazer uma nova pergunta, as pessoas a declaram Duplicate
. Realmente decepcionante; (
String.contains()
que verifica se a sequência contém uma sequência especificada de valores de caracteresString.indexOf()
que retorna o índice dentro da string da primeira ocorrência do caractere ou substring especificado (há 4 variações desse método)String.contains(""+c)
Não sei exatamente o que o pôster original está perguntando exatamente. Como indexOf (...) e contém (...) provavelmente usam loops internamente, talvez ele esteja olhando para ver se isso é possível sem um loop? Eu posso pensar em duas maneiras fora de mão, uma seria, naturalmente, a recorrência:
public boolean containsChar(String s, char search) {
if (s.length() == 0)
return false;
else
return s.charAt(0) == search || containsChar(s.substring(1), search);
}
O outro é muito menos elegante, mas completo ...:
/**
* 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;
}
O número de linhas cresce à medida que você precisa para suportar seqüências cada vez maiores, é claro. Mas não há loops / recorrências. Você pode até remover a verificação de comprimento se estiver preocupado com o fato de que esse comprimento () use um loop.
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");
}
Você pode usar 2 métodos da String
classe.
String.contains()
que verifica se a sequência contém uma sequência especificada de valores de caracteresString.indexOf()
que retorna o índice dentro da string da primeira ocorrência do caractere ou substring especificado ou retorna -1 se o caractere não for encontrado (existem 4 variações desse método)Método 1:
String myString = "foobar";
if (myString.contains("x") {
// Do something.
}
Método 2:
String myString = "foobar";
if (myString.indexOf("x") >= 0 {
// Do something.
}
Links de: Zach Scrivena
Para verificar se algo não existe em uma sequência, você precisa pelo menos observar cada caractere em uma sequência. Portanto, mesmo se você não usar explicitamente um loop, ele terá a mesma eficiência. Dito isto, você pode tentar usar str.contains ("" + char).
Se você precisar verificar a mesma sequência com frequência, poderá calcular as ocorrências de caracteres antecipadamente. Esta é uma implementação que usa uma matriz de bits contida em uma matriz longa:
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;
}}
Sim, usando o método indexOf () na classe de sequência. Consulte a documentação da API para este método
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);
}
}
for
não é um loop agora?
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'
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());
}
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
Abaixo está o que você estava procurando?
int index = string.indexOf(character);
return index != -1 && string.lastIndexOf(character) != index;
&& string.lastIndexOf(character) != index
Você não poderá verificar se char aparece em alguma string sem pelo menos passar por cima da string uma vez usando loop / recursão (os métodos internos como indexOf também usam um loop)
Se não. Às vezes, você consulta se um caractere está na string x é muito mais do que o comprimento da string do que eu recomendaria usar uma estrutura de dados Set , pois isso seria mais eficiente do que simplesmente usarindexOf
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
Usando set, você poderá verificar se o caractere existe em uma string em tempo constante O (1), mas também usará memória adicional (a complexidade do espaço será O (n)).
Eu usei o método string.includes () para isso, que retorna true ou false se a string ou o caractere for encontrado. Veja a documentação abaixo.
// isso é apenas o principal ... você pode usar um leitor ou scanner com buffer
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...