Senhores estou encontrando dificuldade para implementar um método que gerencia as senhas do meu sistema de acordo com as regras estipuladas. Uma das regras eu nao consegui implementar, onde cada caracter da senha só poderá se repetir uma unica vez. Qual seria a forma de trabalhar essa regra?
Bom dia,
Existem mtas maneiras de se fazer. O String é um array de caracteres. Com o metodo toCharArray() vc consegue fazer.
http://java.sun.com/j2se/1.5.0/docs/api/
Abraço
Você pode implemetar esta regra atravéz do uso de expressões regulares. Para isso, pesquise no google sobre o assunto.
[quote=Marck]Bom dia,
Existem mtas maneiras de se fazer. O String é um array de caracteres. Com o metodo toCharArray() vc consegue fazer.
http://java.sun.com/j2se/1.5.0/docs/api/
Abraço[/quote]
Como eu faria o comparativo dos caracteres atraves desse metodo???
usando um for
vc vai ter um array de caracteres ao usar esse método.
depois usando um pouco de lógica vc faz :
for (int i=0 ; i>suaString.length;i++){
for (int j=0 ; j>suaString.length;j++){
//se for verdadeiro os caracteres se repetem. Cuidado pois a primeira comparação é verdadeira afinal a posição 0 esta sndo comparada com a posição 0
if(arrayString[i] == arrayString[j]) {
}
}
}
[code]String[] senha = {novaSenha};
for (int z = 0; z < senha.length - 1; z++) {
for (y = z + 1; y < senha.length; y++) {
if (senha[z].compareTo(senha[y]) == 0) {
throw new Exception(“repetido, oba!!!”);
}
}
}[/code]
Eu já estava fazendo do jeito que vc falou, mas quando debugo nem entra na iteraçao!!!
o que sera q ta acontecendo???
Esse vetor q vc criou tem somente uma posicao… Vc criou um vetor de Strings…
O correto e vc criar um vetor de caracteres…
Verifica se isso te ajuda:
public static boolean isRepeat(){
char [] c = stringSenha.toCharArray(); //pega seu string e transforma em um vetor de caracteres
for(int i = 0; i < c.length; i++){
for(int a = c.length - 1; a > 0; a--){
if (i != a){ //evita q seja comparado a mesma posicao
if (c[i] == c[a]){
return true;
}//if
}
}//for
}//for
return false;
}
edit:
Não Entra pq tem um erro de lógica nessa linha:
for (int z = 0; z < senha.length - 1; z++) {
z = 0
senha.length - 1 = 0
0 < 0 ? falso
Repare q seu array de string tem somente uma posição.
A idéia das expressões regulares, na minha opinião, é a melhor. Ou usa uma Máquina de Turing :).
Ou, usa uma String só e depois passa cada char, com o charAt() prum ArrayList de char. Você usa o método contains() do ArrayList pra ver se já existe. Infelizmente, acredito que sejam 20 e tantos ifs. Só que, com expressões regulares ou Máquina de Turing você diminuiria isso (eu acho), porque é uma maneira de trabalhar diferente. Eu nunca implementei uma Máquina de Turing, mas fiz 2 trabalhos com amigos meus que implementam tanto Autômatos Finitos Determinísticos com expressões regulares. Não sei se um autômato se encaixa no seu problema, então veja a Máquina de Turing ou as expressões regulares que é sucesso na certa.
[quote=dedejava]A idéia das expressões regulares, na minha opinião, é a melhor. Ou usa uma Máquina de Turing :).
Ou, usa uma String só e depois passa cada char, com o charAt() prum ArrayList de char. Você usa o método contains() do ArrayList pra ver se já existe. Infelizmente, acredito que sejam 20 e tantos ifs. Só que, com expressões regulares ou Máquina de Turing você diminuiria isso (eu acho), porque é uma maneira de trabalhar diferente. Eu nunca implementei uma Máquina de Turing, mas fiz 2 trabalhos com amigos meus que implementam tanto Autômatos Finitos Determinísticos com expressões regulares. Não sei se um autômato se encaixa no seu problema, então veja a Máquina de Turing ou as expressões regulares que é sucesso na certa.[/quote]
Caramba!!!
[quote=Marck]Esse vetor q vc criou tem somente uma posicao… Vc criou um vetor de Strings…
O correto e vc criar um vetor de caracteres…
Verifica se isso te ajuda:
public static boolean isRepeat(){
char [] c = stringSenha.toCharArray(); //pega seu string e transforma em um vetor de caracteres
for(int i = 0; i < c.length; i++){
for(int a = c.length - 1; a > 0; a--){
if (i != a){ //evita q seja comparado a mesma posicao
if (c[i] == c[a]){
return true;
}//if
}
}//for
}//for
return false;
}
Muito obrigado!!! Solucionou o meu problema. Mas agora a questão é a seguinte: Na hora de trocar a senha o usuário poderá repetir um caractere da senha no maximo duas vezes.
pensei nisso:
if (c[i] == c[a]){
repete++;
return true;
}//if
se o repete for maior que 2 lanço o erro.
correto???
Pode ser cara…
Mas vc tem que pensar uma coisa: vc vai ter n caracteres, como vc vai saber qual caracter já repetiu???
Pensa em alguma coisa e posta ai…
realmente…
é que eu penso e falo ao mesmo tempo!!!srrsrssrsrsrsrsrsrsr
testei aqui o que eu pensei!!! ficou num loop infinito!!!srssrsrsrsr
vou rachar a cuca aqui!!!
Ex:
alexandre - a letra ‘a’ e ‘e’ se apareceu 2 vezes! isso que você precisa que apareça apenas 2 ou 1 vez ?
???
[quote=Marck][quote=dedejava]A idéia das expressões regulares, na minha opinião, é a melhor. Ou usa uma Máquina de Turing :).
Ou, usa uma String só e depois passa cada char, com o charAt() prum ArrayList de char. Você usa o método contains() do ArrayList pra ver se já existe. Infelizmente, acredito que sejam 20 e tantos ifs. Só que, com expressões regulares ou Máquina de Turing você diminuiria isso (eu acho), porque é uma maneira de trabalhar diferente. Eu nunca implementei uma Máquina de Turing, mas fiz 2 trabalhos com amigos meus que implementam tanto Autômatos Finitos Determinísticos com expressões regulares. Não sei se um autômato se encaixa no seu problema, então veja a Máquina de Turing ou as expressões regulares que é sucesso na certa.[/quote]
Caramba!!![/quote]
?
É que na verdade, hoje, os estudantes querem se achar tanto nos fóruns que eu, como voce hei de saber, sou um cara muito culto e presente, tanto na sociedade Lituanense, quanto na sociedade Russa. Por isso (como você deve saber, de acordo com o Tratado de Varsóvia, os russos tem os pensamentos mais lógicos computacionais existentes), eu tenho grande prazer por falar palavras estupidamente difíceis e frases com expressões que geralmente fujam do cotidiano, fazendo com que muitas vezes, as pessoas pensem que eu sei alguma coisa, enquanto na minha cabeça só tem alguma cevada com alcool etílico.
Resumindo: são só palavras difíceis, mas os conceitos são muito tranquilos
Ou, uma outra alternativa é você fazer o que o Marck falou
Mas pode ter certeza que do meu jeitão funciona também.
Abraço.
[quote]Ex:
alexandre - a letra ‘a’ e ‘e’ se apareceu 2 vezes! isso que você precisa que apareça apenas 2 ou 1 vez ?
???[/quote]
por ai…
mas umas das regras é que a senha tera que ter exatamente 8 caracteres.
algo como:
aabb1122 pode ocorrer.
e
aaab1122 nao pode ocorrer.
pq o caracter a se repetiu mais de uma vez e só pode repetir uma unica vez cada caracter que compoe a senha.
iai cara…conseguiu ai?
Deu uma implementada, ve se ficou bom…
public static boolean isRepeat(char [] cChar){
char [] c = cChar;
int [] rep = new int[8];
for(int i = 0; i < c.length; i++){
for(int a = c.length - 1; a >= 0; a--){
if ( i != a ){ //evita q seja comparado a mesma posicao
if ( c[i] == c[a] ){
rep[i] = rep[i] + 1;
}//if
}
}//for
}
//percorre o vetor de repetidos
for(int i = 0; i < rep.length; i++) {
if (rep[i] > 1){ //verifica se apareceu mais q o esperado
return true;
}
}
return false;
}
pra testar eu usei:
public static void main (String [] args){
char cx [] = "aaab1122".toCharArray();
System.out.println(isRepeat(cx));
}
abraço!!!
fenomenal!!!
vou embora pra casa!!!srsrsrsrsrsr
valeu mesmo cara!!! você resolveu meu problema e me alertou em uma coisa:
estudar vetores
minha lógica ainda está muito presa ao basico que agente aprende em cursos!!!
e java não é facil… tem que estudar!!!
Cara grande abraço pra você e muito obrigado mesmo!!!