Kk

nn

Bom Dia.

Eu faria desse modo:

Faria um programa que receberia a mensagem e transformaria ela em um array de char, criaria um for para percorrer esse array, em toda posição to array chamaria um método para fazer a mudança.

O método que faz a mudança seria um método que receberia um char e retornaria um char, ele pegaria o char que recebeu transformaria no seu numero ASCII correspondente,somaria 1 e transformaria novamente em char e retornaria o char mudado.

Caso você não saiba transformar em ASCII tem essa pergunta no grupo que tem bastantes exemplos.

2 curtidas

Esta é uma possibilidade:

import java.util.stream.Collectors;

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        String inverso = texto.chars()
                .mapToObj(i ->  Character.toString((char) (i + 1)))
                .collect(Collectors.joining(""));

        System.out.println(inverso);
    }
}
1 curtida

Muito obrigado!!

Não entendi oq vc disse! sou um pouco noob, esou começando java agora! me ajude

O código funciona pra qualquer palavra.

Usei uma String comum no exemplo porque achei que seu problema fosse apenas com a inversão.

Em Java, pra poder permitir que o usuário entre com a String, vc vai ter que usar a classe Scanner.

Ficaria algo mais ou menos assim:

/* ... */
String texto = new Scanner(System.in).nextLine();
/* ... */

Mestre deu certinho agora vou estudar oq vc usou aq!
muito foda vc!
poderia me explicar seu codigo? tipo tem algumas coisas ali q numca vir!
como falei estou começando agora!

Olha o jeito q ficou

 String texto = new Scanner(System.in).nextLine();
    String inverso = texto.chars()
            .mapToObj(i ->  Character.toString((char) (i + 1)))
            .collect(Collectors.joining(""));
      System.out.println("A palavra cripitografada e " +inverso);

Explica cada linha please

String inverso = texto.chars() ->EXPLICA?
.mapToObj(i -> Character.toString((char) (i + 1)))->EXPLICA?
.collect(Collectors.joining(""))->EXPLICA?

Para este código eu usei um recurso disponível a partir da versão 8 do Java que são as Streams e o método chars() que está disponível a partir da versão 9.

Primeiro eu usei o código abaixo para transformar a String em uma Stream de inteiros.

texto.chars()

Uma stream é uma sequencia de valores, é quase como um array se vc for pensar que as duas estruturas organizam seus elementos sequencialmente.

Contudo, Streams são mais versáteis e permitem que nós as manipulemos de formas que não é possível ou que seria mais trabalhso usando arrays comuns.

Por exemplo: O próximo passo, destacado no trecho abaixo, eu transformei a sequencia/stream de inteiros em uma sequencia de Strings.

Eu peguei cada item da sequencia (representado pela variável i e somei com + 1 para avançar a letra (‘a’ vira ‘b’, ‘b’ vira ‘c’ e assim por diante).

E com a ajuda do método Character.toString() eu transformei a letra resultante em string.

.mapToObj(i ->  Character.toString((char) (i + 1)))

Por último eu usei o trecho abaixo para pegar/coletar cada item da sequencia e juntar tudo numa String só.

.collect(Collectors.joining(""));

Se eu quisesse juntar tudo, mas inserindo uma virgula entre cada letra, eu poderia fazer assim:

.collect(Collectors.joining(", "));

Um exemplo de outra coisa legal que é possível de fazer é o seguinte: digamos que a gente queira excluir as vogais antes de fazer a criptografia, ficaria assim:

String inverso = texto.chars()
	.filter(i -> "AEIOUaeiou".indexOf(i) == -1)
        .mapToObj(i ->  Character.toString((char) (i + 1)))
        .collect(Collectors.joining(""));

Uma forma mais simples de fazer, sem Streams, seria assim:

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        char[] array = texto.toCharArray();
        String inverso = "";

        for(int i = 0; i < texto.length(); i++) {
            inverso += (char) (array[i] + 1);
        }

        System.out.println(inverso);
    }
}

O problema da forma acima é que ela cria uma nova String a cada iteração do loop. O mais correto (e não tão simples) seria usar o StringBuilder.

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        char[] array = texto.toCharArray();
        StringBuilder builder = new StringBuilder();

        for(int i = 0; i < texto.length(); i++) {
            builder.append((char) (array[i] + 1));
        }

        String inverso = builder.toString();

        System.out.println(inverso);
    }
}

A idéia é que em Java, String são imutáveis e, por isso, quando vc soma uma String com outra String, vc não está modificando-a, vc está criando uma String completamente nova com o valor somado das outras.

O StringBuilder nos ajuda a compor String de forma mais performática. Ele tem mecanismos que evitam a criação de tantas Strings desnecessárias.

1 curtida

sensacional sua explicação valeu!! qualquer duvida te chamo!

Voçê sabe outro jeito de fazer usando um (for) e criando um (vetor) com o alfabeto?

Eu mostrei como é possível fazer com o for, só não sei onde esse vetor com o alfabeto se encaixa na história.

Pois e acho q estou pensando errado!

vir aq com o for!!

e como descriptografar? deixando do mesmo jeito q o usuário digitou?

Do mesmo jeito, só que fazendo -1 ao invés de +1. Exemplo:

Com Streams:

inverso.chars()
       .mapToObj(i ->  Character.toString((char) (i - 1)))
       .collect(Collectors.joining(""));

valeu

Mestre !pra quem ta começando agora o ideal seria estudar bastante vetor e matriz e saber bem como usar? Se eu souber usar bem consigo resolver muitos algoritmos?

Vetores (ou arrays) são bastante úteis em várias situações e vc tem sim que entender bem.

O ideal seria vc escolher um curso ou um livro ou algum tutorial, que apresenta uma estrutura de aprendizado, e fosse seguindo no seu tempo, aprendendo progressivamente.

Mas que parte do uso dos arrays vc não entende?

Posso fazer um Array de qualquer coisa? tipo int e String?
E como faço pra chamar ele tipo deixando ele livre para o usuario digitar!
Um livro bom que voçê pode me indicar, para pro seguir passo a passo.