Desejo imprimir um Stack<Integer>
objeto tão bem quanto o depurador Eclipse (isto é [1,2,3...]
), mas imprimi-lo com out = "output:" + stack
não retorna esse resultado agradável.
Só para esclarecer, estou falando da coleção interna do Java, portanto não posso substituí-la toString()
.
Como posso obter uma boa versão imprimível da pilha?
java
debugging
pretty-print
Elazar Leibovich
fonte
fonte
AbstractCollection@toString
(e, portantoString + Stack
), já o imprime como você deseja.Respostas:
Você pode convertê-lo em uma matriz e imprimi-lo com
Arrays.toString(Object[])
:fonte
stack.toArray()
pode ser muito caro, CPU, tempo e memória. uma solução que itere sobre a coleção original / iterável provavelmente consumirá menos recursos.(Java 8)
fonte
yourCollection.stream().map( o -> o.toString() ).collect( joining(",") ))
é melhor porque você lê da esquerda para a direita, não precisa olhar para trás para calcular em seu cérebro o que é feito com a lista intermediáriaCom java 8 streams e coletores, isso pode ser feito facilmente:
primeiro usamos
map
comObject::toString
para criarCollection<String>
e, em seguida, usamos o coletor de junção para unir todos os itens da coleção,
como delimitador.fonte
Collections.toString(stack)
seria fácil.A classe MapUtils oferecida pelo projeto Apache Commons oferece um
MapUtils.debugPrint
método que imprime bastante o seu mapa.fonte
System.out.println (Coleção c) já imprime qualquer tipo de coleção em formato legível. Somente se a coleção contiver objetos definidos pelo usuário, você precisará implementar toString () na classe definida pelo usuário para exibir o conteúdo.
fonte
Implemente toString () na classe.
Eu recomendo o Apache Commons ToStringBuilder para facilitar isso. Com isso, você apenas precisa escrever este tipo de método:
Para obter esse tipo de saída:
Há também uma implementação reflexiva .
fonte
Goiaba parece uma boa opção:
Iterables.toString(myIterable)
fonte
Concordo com os comentários acima sobre substituir
toString()
suas próprias classes (e sobre como automatizar esse processo o máximo possível).Para as classes que você não definiu, você pode escrever uma
ToStringHelper
classe com um método sobrecarregado para cada classe de biblioteca que deseja manipular de acordo com seu próprio gosto:EDIT: Respondendo ao comentário de xukxpvfzflbbld, aqui está uma possível implementação para os casos mencionados anteriormente.
Esta não é uma implementação completa, mas apenas uma iniciação.
fonte
Você pode usar a classe "Objetos" do JAVA (disponível desde 1.7)
Saída: 1273, 123, 876, 897
Outra possibilidade é usar a classe "MoreObjects" do Google Guave , que fornece muitas funções úteis de ajuda:
Saída: NameOfYourObject = [1273, 123, 876, 897]
Documentos da goiaba
fonte
Objects.toString()
apenas chamatoString()
a coleção. No seu exemplo, isso funciona porque, presumivelmente,toString()
na coleção baseada em array, ocorre uma boa impressão.Com o Apache Commons 3 , você deseja ligar
fonte
Em Java8
ou
fonte
Apenas modifiquei o exemplo anterior para imprimir uma coleção uniforme contendo objetos definidos pelo usuário.
fonte
a maioria das coleções possui um útil
toString()
em java atualmente (Java7 / 8). Portanto, não há necessidade de executar operações de fluxo para concatenar o que você precisa, basta substituirtoString
sua classe de valor na coleção e obter o que você precisa.tanto AbstractMap e AbstractCollection implementar toString () chamando toString por elemento.
abaixo está uma classe de teste para mostrar comportamento.
fonte
JSON
Uma solução alternativa pode ser converter sua coleção no formato JSON e imprimir a string Json. A vantagem é uma Cadeia de Objetos bem formatada e legível, sem a necessidade de implementar o
toString()
.Exemplo usando o Gson do Google :
fonte
Se esta é sua própria classe de coleção, e não uma incorporada, você precisa substituir o método toString. O Eclipse chama essa função para qualquer objeto para o qual não tenha uma formatação conectada.
fonte
Cuidado ao chamar Sop na Collection, pois isso pode gerar
ConcurrentModification
Exception. Porque internamente otoString
método de cada coleção chama internamenteIterator
a coleção.fonte
Deve funcionar para qualquer coleção
Map
, exceto , mas também é fácil de suportar. Modifique o código para passar esses 3 caracteres como argumentos, se necessário.fonte
Você pode tentar usar
fonte
Existem duas maneiras de simplificar seu trabalho. 1. importe a biblioteca Gson. 2. use Lombok.
Ambos ajudam a criar String a partir da instância do objeto. O Gson analisará seu objeto, o lombok substituirá o objeto de classe no métodoString.
Eu coloquei um exemplo sobre o Gson prettyPrint, crio uma classe auxiliar para imprimir objetos e coleção de objetos. Se você estiver usando o lombok, poderá marcar sua classe como @ToString e imprimir seu objeto diretamente.
}
fonte