How to remove spaces from a string in Java?

6

I'm having a question about how to remove spaces from a string in Java, by doing this through for .

I'm making a diamond of letters, 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 mount the top part of the diamond, but you have to do the bottom one, and I need to use the variable that contains all the spaces. My idea is to take the space between the 2 F's and decrease 2 spaces to each loop until it reaches the letter A.

If you can help me, thank you, because I'm breaking my heart to solve this simple problem.

asked by anonymous 20.11.2017 / 21:04

3 answers

8

I propose the following changes in the class to get the desired result (explanations in comments inside 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");
  }
}

Running the above code results in:

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

See working at IDEone .

    
20.11.2017 / 23:39
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 my friend Sorack, I put it inside a for and determined that with each loop it cuts 2 spaces that are in the variable spaceLatras that keeps the spaces of the diamond. p>

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 asked for 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
    
22.11.2017 / 13:00
0

Kelvera, I understood your logic, but first I wanted to propose a way that I think is simpler, I do not know if it fits into your scenario. Instead of assembling the diamond by removing the spaces, would not you rather start where you do not have space and add?

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)
}

Does this fit your scenario?

    
20.11.2017 / 21:22