How to remove spaces from a string in Java?

Asked

Viewed 469 times

6

I’m having a question about how to remove spaces from a Java string by doing this through the for.

I’m making a letter diamond, and I use a variable to create the space between the letters.

                     A
                    B B
                   C   C
                  D     D
                 E       E
                F         F
               G           G

I was able to assemble the top of the diamond, but we need to do the bottom, and I need to use the variable that contains all the spaces. My idea is to take the space between the 2 F and decrease 2 spaces at each loop until it reaches the letter A.

If you can help me, thank you, because I’m cracking my skull to solve this simple problem.

Below is the code I made, it got big, because I’m new in java and programming in general, and I don’t have the techniques yet:

public class Diamante {
    public void MontarDiamante()
    {
        //PARTE SUPERIOR
String espaço = {" ", "  ", "   "...etc} // Coloquei 26 posições de espaços para cada uma das letras do alfabeto para criar os espaços que ficam do lado esquerdo de fora do diamante.
        int x = 0;      
        String espacoLetras = " ";

        String alfabeto[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        String letra = JOptionPane.showInputDialog("Diamante de Letras\nInsira uma Letra: ");
        for(int c = 0; c < alfabeto.length; c++)
        {
            if(c == 0)
            {
                System.out.println(espacos[0]+alfabeto[0]);
            }
            System.out.println(espacos[c+1]+alfabeto[c+1]+espacoLetras+alfabeto[c+1]);
            espacoLetras = espacoLetras + "  ";
            if(letra.equals(alfabeto[c+1]))
            {
                x = c;
                break;              
            }
        }

        //PARTE INFERIOR DO DIAMANTE
        for(int i = x; i >= 0 ; i--)
        {
            espacoLetras = espacoLetras.trim();
            System.out.println(espacos[i]+alfabeto[i]+espacoLetras+alfabeto[i]);
            /*if(i == 0)
            {
                System.out.println(espacos[i]+alfabeto[i]);
            }*/

        }
    }

    public static void main(String args[])
    {
        Diamante d = new Diamante();
        d.MontarDiamante();
    }
}
  • 1

    It would be easier to understand what you are doing if you showed the code that makes the top half. Doing this by replacing spaces is possible, but I would need to know which variables you are talking about.

3 answers

8


I propose the following changes in the class to get the desired result (explanations in comments within the code):

import java.util.Arrays;

public class Diamante {

  private static final String[] ALFABETO = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

  public void montar(String escolhida) {
    int maximo = Arrays.binarySearch(ALFABETO, escolhida); // Encontra a posição da letra passada como parâmetro
    boolean par = (maximo % 2) == 0; // Verifica se o número é par ou impar para cálculo da posição
    int metade = Math.floorDiv(maximo, 2); // Encontra a posição onde ficará o meio do diamante
    String espacos = "               ".substring(0, metade); //Corta o número de espaços para realizar o espelhamento
    int posicao = 0; // Inicia o contador de posição

    for (int indice = 0; indice <= maximo; indice++) {
      String letra = ALFABETO[indice];
      StringBuilder construtor = new StringBuilder(espacos); // Monta um StringBuilder para substituição das letras
      String texto;

      // Se for a primeira posição ou a última não espelha o texto
      if (posicao == 0) {
        texto = espacos + letra + espacos;
      } else {
        construtor.setCharAt(posicao - 1, letra.charAt(0)); // Coloca a letra na posição correta dentro da String de espaços
        texto = construtor.toString();
        texto = this.inverter(texto) + " " + texto; // Inverte o texto obtido criando espelhamento
      }

      System.out.println(texto); // Imprime na tela

      if (indice < metade) { // Caso ainda não tenha passado da metade, coloca mais espaços
        posicao++;
      } else if (par || indice > metade) { // Caso tenha passado da metade ou seja par e esteja na metade começa a remover espaços
        posicao--;
      }
    }
  }

  public String inverter(String texto) {
    StringBuilder construtor = new StringBuilder(texto);

    return construtor.reverse().toString();
  }

  public static void main(String[] args) {
    Diamante d = new Diamante();

    d.montar("H");
  }
}

The execution of the above code results in:

   A
  B B
 C   C
D     D
E     E
 F   F
  G G
   H

See working on Ideone.

1

I want to thank everyone who has volunteered to help me solve the problem!

I was able to solve the problem using the substring that was used in the code of the friend Sorack, I put it inside a for and determined that at each loop it cuts 2 spaces that are in the variable spacLetras that guards the spaces of the diamond.

Follow the code below:

int x = 0;  


    String espacoLetras = " ";
    String espacos[] = {"                         ","                        ","                       ","                      ","                     ","                    ","                   ", "                  ", "                 ",
     "                ", "               ", "              ", "             ", "            ", "           ", "          ", "         ", "        ", "       ", "      ",
     "     ", "    ", "   ", "  ", " ", "",};
    String alfabeto[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    String letra = JOptionPane.showInputDialog("Diamante de Letras\nInsira uma Letra: ");

    letra = letra.toUpperCase(); //Converter letra minuscula para maiuscula.

    if(letra.equals("A")) //Tratamento quando o usuário insere A, pois não possivel formar um diamante somente com A.
    {
        JOptionPane.showMessageDialog(null,"Não é possivel montar um diamente somente com A!\nInsira uma letra depois de A!");
    }
    else
    {
        for(int c = 0; c < alfabeto.length; c++)
        {
            if(c == 0)
            {
                System.out.println(espacos[0]+alfabeto[0]);
            }
            System.out.println(espacos[c+1]+alfabeto[c+1]+espacoLetras+alfabeto[c+1]);
            espacoLetras = espacoLetras + "  ";
            if(letra.equals(alfabeto[c+1]))
            {
                x = c;
                break;              
            }
        }
        //PARTE INFERIOR DO DIAMANTE
        int total_espaco = espacoLetras.length();
        total_espaco = total_espaco - 2;

        for(int i = x; i >= 1 ; i--)
        {
            total_espaco = total_espaco - 2; 
            espacoLetras = espacoLetras.substring(0, total_espaco);
            System.out.println(espacos[i]+alfabeto[i]+espacoLetras+alfabeto[i]);
            if(i == 1)
            {
                System.out.println(espacos[0]+alfabeto[0]);
            }
        }
    }
}

And the code ends up displaying the diamond the way it was requested in the statement.

                     A
                    B B
                   C   C
                  D     D
                 E       E
                F         F
               G           G
                F         F
                 E       E
                  D     D
                   C   C
                    B B
                     A

0

Kelvera, I understand your logic, but first I wanted to propose a way that I think is simpler, I don’t know if it fits your scenario. Instead of putting the diamond together by removing the spaces, it wouldn’t be better if you started where you don’t have space and added?

String espaco = ' ';

String letras_array = 'ABCDEFG';
System.out.println(letras_array.charAt(0)); //Imprime a primeira letra

//For para imprimir o diamante
for (int i = 1; i < letras_array.length() ; i++){
  System.out.println(letras_array.charAt(i) + espaco + letras_array.charAt(i));
  espaco = espaco + '  '; //(para cada loop, ele vai adicionar dois espaços)
}

That fits your scenario?

  • I think not, because the idea is to mount a diamond with a letter inserted by the user and with this letter will be set the middle of the diamond.

  • Put this information in the question, all the answers that can be formulated to your question will have no idea of this omitted information, and it does not make them wrong.

Browser other questions tagged

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