Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Ajuda com metodo toString()

Ola a todos. Estou com algumas dúvidas quanto ao meu método toString(). Tenho um trabalho que pede essa saída de dados:

ID: 0000000001
Title: Fundamentos de programación
Published: 2015
Genre: STEM
Loanable: Yes
Copies: 2 (40,60 €)
    1 ...... P3-E3
    5 ...... P3-E3

Estou quase lá mas preciso de umas dicas quanto a formatação meu código esta assim:

@Override
    public String toString() {

        Copy[] aux = new Copy[getNumCopies()];

        for (int i = 0; i < copies.length; i++) {        
            if (copies[i] != null) {
                aux[i] = copies[i];
            }    
        }

        if (isLoanable() == true) {
            return "ID: " + getId() + "\n" + "Title: " + getTitle() + "\n" + "Published: " + getYearPublished() + "\n"
                    + "Genre: " + getGenre() + "\n" + "Loanable: " + "YES" + "\n" + "Copies: " + getNumCopies() + " ("
                    + getTotalCost() + " €)" + "\n" + "\t" + Arrays.toString(aux);
        } else {
            return "ID: " + getId() + "\n" + "Title: " + getTitle() + "\n" + "Published: " + getYearPublished() + "\n"
                    + "Genre: " + getGenre() + "\n" + "Loanable: " + "NO" + "\n" + "Copies: " + getNumCopies() + " ("
                    + getTotalCost() + " €)" + "\n" + "\t" + Arrays.toString(aux);
        }
    }

e com saída:

ID: 0000000001
Title: Fundamentos de Programacion
Published: 2015
Genre: STEM
Loanable: YES
Copies: 7 (142.1 €)
    [1 …… P3-E2
    , 2 …… P3-E2
    , 3 …… P3-E2
    , 4 …… P3-E2
    , 5 …… P3-E2
    , 6 …… P3-E2
    , 7 …… P3-E2
    ]

Como tirar as " [ " e as " , " ? Tem alguma forma de não precisar utilizar um laço e um novo vetor para não mostrar os valores null do vetor original? Porque se jogo diretamente assim:

Arrays.toString(copies)

Tenho essa saída:

ID: 0000000001
Title: Fundamentos de Programacion
Published: 2015
Genre: STEM
Loanable: YES
Copies: 7 (142.1 €)
    [1 …… P3-E2
    , 2 …… P3-E2
    , 3 …… P3-E2
    , 4 …… P3-E2
    , 5 …… P3-E2
    , 6 …… P3-E2
    , 7 …… P3-E2
    , null, null]

O metodo toString() da classe Copy esta assim:

@Override
    public String toString() {
        return "ID: " + getNumber() + " …… " + "location: " + getLocation() + "\n" + "\t";
    }
7 respostas

Olá,

Você pode usar um String.replaceAll() para retirar as virgulas e String.replace() para os colchetes.

String a = "[a,b,c,d]";
String novaString = a.replaceAll(",", "").replace("[", "").replace("]","");

Obrigado pela Ajuda Marcelo!

Vi aqui que no próprio toString tem esse replace e consegui tirar os caracteres indesejados.

ficou assim:

Arrays.toString(aux).replace("[", "").replace(",", "").replace("]", "");

Agora esta praticamente igual ao exemplo somente o alinhamento da primeira linha esta diferente das outras.

ID: 0000000001
Title: Fundamentos de Programacion
Published: 2015
Genre: STEM
Loanable: YES
Copies: 7 (142.1 €)
    1 …… P3-E2
     2 …… P3-E2
     3 …… P3-E2
     4 …… P3-E2
     5 …… P3-E2
     6 …… P3-E2
     7 …… P3-E2

Olá,

Muito bom, o Array.toString() é uma String, por isso deu certo.

O que provavelmente deve ter ali é um espaço, tente assim:

.replace(", ", "") //uma virgula e um espaço

Assim talvez ajude.

Oi Gabriel! Tudo bem?

No seu problema eu consigo enxergar duas coisas:

1) Você está apresentando o modelo padrão de representação de arrays como texto da Arrays e modificar a notação padrão não me parece o correto.

Sugiro não manipular strings. Crie sua implementação.

2) Arrays vai incluir elementos vazios, pelo que entendi, seu array tem 9 posições e você está preenchendo 7. Por isso dos dois nulls no final.

Abaixo escrevi um código compatível com java 8+ que atenderia suas necessidades para arrumar o toString de copies.

Parti do pressuposto que o toString to Copy esteja funcionando e retornando os valores n....P3-E2.

import java.util.Arrays;
import java.util.stream.Collectors;

public class Teste {

    public static void main(String[] args) {

    /* Criando um array similar ao resultado proposto apenas para testes
    No seu caso, Gabriel, seu array já vai conter objetos cuja representação seria essa abaixo */
        String[] values = new String[9];
        values[0] = "1 …… P3-E2";
        values[1] = "2 …… P3-E2";
        values[2] = "3 …… P3-E2";
        values[3] = "4 …… P3-E2";
        values[4] = "5 …… P3-E2";
        values[5] = "6 …… P3-E2";
        values[6] = "7 …… P3-E2";

        String copyAsString = "\t" + Arrays.stream(values) //Cria um stream à partir do seu array
            .filter(copy -> copy!=null) //Remove os vazios
            .collect(Collectors.joining("\n\t")); //Junta tudo utilizando quebra de linha e tabulação

            System.out.println(copyAsString);
    }

}

A saída seria essa:

   1 …… P3-E2
    2 …… P3-E2
    3 …… P3-E2
    4 …… P3-E2
    5 …… P3-E2
    6 …… P3-E2
    7 …… P3-E2

Espero ter ajudado.

Abraço e sucesso!

Rodrigo

Ola Marcelo, realmente agora sim saiu igual! O espaço ali alinhou a coluna certinho.

Valeu pela ajuda!

Ola Rodrigo, gostei bastante do exemplo que você criou mas fui tentar implementar aqui e tenho um erro em uma das chamadas.

String copyAsString = "\t" + Arrays.stream(copies).filter(copy -> copy != null).collect(Collectors.joining("\n\t"));

Nesse ponto:

.collect(

o Java me joga essa mensagem:

The method collect(Collector<? super Copy,A,R>) in the type stream<Copy> is not applicable for the arguments (Collector<CharSequence,capture#1-of ?,String>)

Se troco por "values" do vetor do seu exemplo ele aceita.

solução!

Oi Gabriel!

Verifiquei que seu array é de objetos Copy e não String como eu havia criado.

Com isso uma linha de conversão se faz necessária.

import java.util.Arrays;
import java.util.stream.Collectors;

public class Teste {

    public static void main(String[] args) {

        Copy[] values = new Copy[9];

        values[0] = new Copy(1, "P3-E2");
        values[1] = new Copy(2, "P3-E2");
        values[2] = new Copy(3, "P3-E2");
        values[3] = new Copy(4, "P3-E2");
        values[4] = new Copy(5, "P3-E2");
        values[5] = new Copy(6, "P3-E2");
        values[6] = new Copy(7, "P3-E2");

        String copyAsString = "\t" + Arrays.stream(values)     //Cria um stream à partir do seu array
            .filter(copy -> copy!=null)                     //Remove os vazios
            .map(copy -> copy.toString())                     //Converte na representação toString de copy
            .collect(Collectors.joining("\n\t"));             //Junta tudo utilizando quebra de linha e tabulação

        System.out.println(copyAsString);
    }

}

class Copy {

    public Copy(int posicao, String codigo) {
        super();
        this.posicao = posicao;
        this.codigo = codigo;
    }

    private int posicao;
    private String codigo;

    public int getPosicao() {
        return posicao;
    }
    public void setPosicao(int posicao) {
        this.posicao = posicao;
    }
    public String getCodigo() {
        return codigo;
    }
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    @Override
    public String toString() {
        return posicao + "……" + codigo;
    }

}

Atenciosamente,

Rodrigo

Obrigado Rodrigo!!

Não conhecia essas funções realmente era como todo mundo fala "provavelmente já existe isso ai que você esta tentando fazer". rsrsrs