Swap the first characters of a String for another

Asked

Viewed 328 times

1

I’m creating a 'fake bank' and wanted to make a method in which partially shows the password.

I created an array called senha2 and the first 4 characters are shown as *, for example:

senha : ****restoDaSenha

But if I do:

String senha3 = senha.charAt(4);

String[] senha2 = { "*", "*", "*", "*", this.senha3};

It does not give error but it happens in the output:

Password : [Ljava.lang.String;@15db9742

What’s the problem in the existing code? It’s an implementation problem, language application?

My code:

package bancofake;

import javax.swing.JOptionPane;

public class Banco {
    String nome; // Dono -> fisico ou juridico
    String senha; // Senha -> Senha da conta para nenhum ladrão louco roubar dinheiro
    double saldo;
    int id; // Id da conta

    String[] senha2 = { "*", "*", "*", "*"};

    int tentativa;

      public void criarSenha() {

          String senhacriada = (JOptionPane.showInputDialog("Qual a senha ?"));

            if(senhacriada.length() >= 8) { 
                System.out.println("Senha criada");
                this.senha = senhacriada;
            }else{
                System.err.println("A senha deve ter no minimo 8 caracteres !"); 
                if(tentativa < 2) {
                    this.tentativa += 1;
                    this.criarSenha();
                }
            }
      }



    public void depositar(double quantidade) {

        int idrecebeu = Integer.parseInt(JOptionPane.showInputDialog("Qual o ID da conta ?"));

        if (idrecebeu == this.id) {
            if (quantidade >= 0) {
                this.saldo += quantidade;
                System.out.println("Depositado R$" + quantidade + " com Sucesso !");
                System.out.println("==| Informação |==");
                System.out.println("Id da Conta : " + this.id);
                System.out.println("Nome do Dono(fisico ou juridico) : ");
                System.out.println(this.nome);
                System.out.println("Saldo : R$" + this.saldo);
            } else if (quantidade <= 0) {
                System.out.println("Você não pode depositar R$" + quantidade + " !");
                System.out.println("Pois a quantidade é igual ou menor que 0 !");
            } else {
                System.err.println("A quantidade não é Depositavel !");
            }
        } else {
            System.out.println("O ID está incorreto e/ou não existe !");
        }
    }

    public void retirar(double quantidade) {

        int idrecebido = Integer.parseInt(JOptionPane.showInputDialog("Qual o ID da conta ?"));
        String senharecebida = (JOptionPane.showInputDialog("Qual a senha ?"));

        if (idrecebido == this.id && senharecebida == this.senha) {
            if (saldo != 0) {
                if (quantidade >= 0) {
                    this.saldo -= quantidade;
                    System.out.println("Retirado R$" + quantidade + " com Sucesso !");
                    System.out.println("==| Informação |==");
                    System.out.println("Id da Conta : " + this.id);
                    System.out.println("Nome do Dono(fisico ou juridico) : ");
                    System.out.println(this.nome);
                    System.out.println("Saldo : R$" + this.saldo);
                } else if (quantidade <= 0) {
                    System.out.println("Você não pode retirar R$" + quantidade + " !");
                    System.out.println("Pois a quantidade é igual ou menor que 0 !");
                } else {
                    System.err.println("A quantidade não é Retiravel !");
                }
            } else if (saldo <= 0) {
                System.out.println("A quantidade não é permitida !");
                System.out.println("Saldo : " + this.saldo);
            }
        } else {
            System.out.println("O ID ou a Senha está Incorreto !");
        }
    }

    public void verificarSaldo() {
        System.out.println("Saldo : " + this.saldo);
        System.out.println("Id da conta : " + this.id);
        System.out.println("Dono da conta : " + this.nome);
        System.out.println("Senha : " + this.senha);
    }

    public void verificarsenha() {
        System.out.println("Senha : "+this.senha);
    }


    public static void main(String[] args) {

    }

}

For example, if the password is "abcdefgh", I want the output to be:

****efgh
  • Edit the question and include all the code involved, only that you posted only to say that you are printing the variable memory address

  • The code I put everything , It’s kind of bad because I’m learning Java this month .

  • Like you’re printing on the screen?

  • System.out.prinln("Senha : "+senha_parcialmente);

  • if password = "12345678" then Password partially = "5678" or "1234"

2 answers

3


In Java, when you print an array directly (System.out.println(array)), the array elements are not shown. Instead, the array type information and its hashcode are shown, as explained here.

For the specific case of an array of String, an alternative to display the contents of the array as a single String is to use the method String.join (available from Java 8):

String[] senhaParcial = { "*", "*", "*", "*", "resto"};
System.out.println(String.join("", senhaParcial)); // ****resto

Or use a StringBuilder:

String[] senhaParcial = { "*", "*", "*", "*", "resto"};
StringBuilder sb = new StringBuilder();
for (String s: senhaParcial) {
    sb.append(s);
}
System.out.println(sb.toString()); // ****resto

To make several concatenations in one loop, the StringBuilder is more efficient than concatenating strings directly (which was the suggested code in the other answer).


But for that array at last?

If you only want to replace the first 4 characters of a String for *, no need to create this array. Just create another String, replacing these characters:

// método que troca os primeiros caracteres da senha
public String escondeSenha(String senha, char secret, int qtd) {
    char[] caracteres = senha.toCharArray();
    // pega o menor número entre o tamanho do array e a quantidade informada
    int tamanho = Math.min(caracteres.length, qtd);
    for (int i = 0; i < tamanho; i++) {
        caracteres[i] = secret;
    }
    return new String(caracteres); // ****efgh
}

String senha = "abcdefgh";
//trocar os 4 primeiros caracteres por *
System.out.println(escondeSenha(senha, '*', 4)); // ****efgh

I took care to check that the number of characters to be replaced is no larger than the string size.

Doing so, you don’t need to create an array for nothing, and still make the code more flexible, you can change the amount and character used.


But if the idea is only print, or need to generate another String:

String senha = "abcdefgh";
int qtd = 4;
int tamanho = Math.min(qtd, senha.length());
for (int i = 0; i < tamanho; i++) { // imprime várias vezes o "*"
    System.out.print('*'); // print não pula a linha
}
// imprime o resto da String
if (tamanho < senha.length())
    System.out.println(senha.substring(qtd));

First I print several times the * (using print instead of println, not to skip the line). Then I see if there are still characters to be printed, and use the method substring to catch the rest of the String (also taking care to check that the indicated size does not exceed the size of the String).

1

this happens because you created a String[] vector and when you print the variable that is linked in the vector it will give you its address in memory,

to solve this problem you can try it.

    String[] senha = { "*", "*", "*", "resto"};
    String senhafinal = "";


    for(String caracter : senha) {

     senhafinal = senhafinal.concat(caracter);
    }

    System.out.println(senhafinal);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.