Retorno contrário - conteúdo de array

7 respostas
henriquelo

Galera,

Estou tentando implementar o método “public static boolean existeCaracterForaAlfabeto( String s )”, mas não estou conseguindo!
O objetivo dele é: comparar uma palavra lida pelo teclado com um alfabeto (criado manualmente em um array de A à Z), com as condições:
- Se houver algum caracter fora do alfabeto o retorno "Existe caracter fora do alfabeto: " deve aparecer TRUE;
- Se ocorrer o contrário (só tiver letrar do alfabeto na palavra digitada), aparece FALSE.

Eu fiz o código abaixo, mas para ambas condições está aparecendo FALSE:
public static boolean existeCaracterForaAlfabeto( String s ) { 
				
		boolean achou = false;
		
		// esse loop percorre as posicoes da string
		for ( int i = 0 ; i < s.length() ; i++ ) {
			
			// esse loop percorre as posicoes do array com as letras
			for ( int j = 0 ; j < alfabeto.length ; j++ ) {
				
				if ( Character.toString(s.charAt(i)).equals(alfabeto[j])) {
					achou = true;
				}
			}
		}
		return achou;
	}
Sinto que é uma alteração pequena que devo fazer, mas não estou conseguindo enxergar!!!

  Grato pela ajuda por enquanto!  :D

7 Respostas

B

Não é necessário você quardar em uma variável todo o alfabeto.

O exemplo abaixo resolve o seu problema:
public class Teste{
    public static void main(String[] args) {
	System.out.println(existeCaracterForaAlfabeto("palavra"));
	System.out.println(existeCaracterForaAlfabeto("1palavra"));
	System.out.println(existeCaracterForaAlfabeto("$palavra"));
	System.out.println(existeCaracterForaAlfabeto("¨palavra"));
	System.out.println(existeCaracterForaAlfabeto(")palavra"));
	System.out.println(existeCaracterForaAlfabeto("pal=avra"));
    }

    public static boolean existeCaracterForaAlfabeto(String s) {
	char[] contList = s.toUpperCase().toCharArray();
	for (char c : contList) {
	    if (Character.getType(c) != Character.UPPERCASE_LETTER) {
		return true;
	    }
	}
	return false;
    }
}

Qualquer dúvida posta ai.

G

Oi Henrique,

acho que você pode conseguir isso de uma forma bem simples…

public boolean existeCaracterForaAlfabeto(String s) {   
    
    return !(s.matches("a-zA-Z]+"));
}

[]'s

Guilherme…
\o

souzaJr

Olá,

O que seu código (lógica) está sugerindo é que só vai mostrar false quando nenhum caracter da String s aparecer no alfabeto… Além de que sua lógica está errada, onde era pra ter false tem true e vice-versa. E toma cuidado com as comparações.

Eu fiz um teste aqui, certamente essa não é a melhor solução, mas vai funcionar… testa aí. Espero ter ajudado…Flw.

public class Teste {

	private static char [] alfabeto = {'a', 'b', 'c'};
	
   	public static boolean existeCaracterForaAlfabeto( String s ) { 
   		for (int i = 0 ; i < s.length() ; i++) {
			int contador = 0;
   			for (int j = 0; j < alfabeto.length ; j++ ) {
				if(s.charAt(i) == alfabeto[j]) {
					contador++;
				}
			}
   			if(contador < 1){
   				return true;
   			}
		}
		return false;
	}
   	
   	public static void main(String a []){
   		System.out.println(Teste.existeCaracterForaAlfabeto("ar"));
   	}
}
henriquelo
souzaJr:
Olá,

O que seu código (lógica) está sugerindo é que só vai mostrar false quando nenhum caracter da String s aparecer no alfabeto... Além de que sua lógica está errada, onde era pra ter false tem true e vice-versa. E toma cuidado com as comparações.

Eu fiz um teste aqui, certamente essa não é a melhor solução, mas vai funcionar... testa aí. Espero ter ajudado...Flw.

public class Teste {

	private static char [] alfabeto = {'a', 'b', 'c'};
	
   	public static boolean existeCaracterForaAlfabeto( String s ) { 
   		for (int i = 0 ; i < s.length() ; i++) {
			int contador = 0;
   			for (int j = 0; j < alfabeto.length ; j++ ) {
				if(s.charAt(i) == alfabeto[j]) {
					contador++;
				}
			}
   			if(contador < 1){
   				return true;
   			}
		}
		return false;
	}
   	
   	public static void main(String a []){
   		System.out.println(Teste.existeCaracterForaAlfabeto("ar"));
   	}
}

souzaJr,

Realmente havia erros no meu código, mas com seu código também ocorreu um erro:

if((s.charAt(i)) == alfabeto[j]) {
Há incompatibilidade de tipos! Tentei resolver fazendo o seguinte:
if((""+s.charAt(i)) == alfabeto[j]) {

Concatenando com uma String vazia. Mas de qualquer forma, ao executar ocorre o mesmo problema inicial: mesmo se eu entrar com uma palavra sem símbolos (ex: teste) ou com símbolos (ex: teste1, teste!), continua em FALSE o resultado do método "existeCaracterForaAlfabeto( String s )".

Com o código do betounisul deu certo! Testei com palavras maiúsculas e minúsculas e o retorno FALSE e TRUE apareceram corretamente!

Poderia explicar-me o que ocorre exatamente nesse método? Como funciona o "UPPERCASE_LETTER"? Provavelmente estou errado, mas por ter usado os métodos toUpperCase e esse UPPERCASSE_LETTER, pensei que daria errado o resultado (true ou false) dependendo de ser palavras maiúsculas ou minúsculas!

public static boolean existeCaracterForaAlfabeto( String s ) { 
		
		char[] contList = s.toUpperCase().toCharArray();  
		for (char c : contList) {  
			if (Character.getType(c) != Character.UPPERCASE_LETTER) {  
				return true;  
			}  
		}  
		return false;  
	}

Acredito que esteja tudo certo, mas preciso ter certeza!

Valeu galera! :P

B

Boa noite.

Para solucionar o seu problema você pode usar uma expressão regular conforme sugerido pelo nosso colega guilhermemm, é mais simples, porém segue somente uma pequena correção pois estava faltando um parêntese no início.

public static boolean existeCaracterForaAlfabeto(String s) { return !(s.matches("[a-zA-Z]+")); }

Quando a solução que eu disponibilizei é o seguinte.

Linha 1

char[] contList = s.toUpperCase().toCharArray();

A String passada por parâmetro é convertida para maiúsculo, retornarndo um array de char.

Linha 2

if (Character.getType(c) != Character.UPPERCASE_LETTER) {

Character.getType©, retornar o código do caracter, todas as maísculas retornam 1, então comparo este valor com a constante Character.UPPERCASE_LETTER que mantém este código “1”.

B

Me equivoquei, não estava faltando um parêntese e sim um colchete.

souzaJr

Olá henriquelo,

Pois é, isso deve ter acontecido por causa que sua variável alfabeto é um array de String e não de char. Eu criei um exemplo assim porque pensei que você na verdade definiria “seu alfabeto” com os caracteres válidos para sua aplicação, e por isso defini um “alfabeto” com a, b e c somente. Aqui na minha máquina o arquivo compilou e executou conforme desejado.

De qualquer forma, a solução para seu problema já foi encontrada. Até mais.

Criado 28 de setembro de 2008
Ultima resposta 28 de set. de 2008
Respostas 7
Participantes 4