<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Code Error - É errando que se aprende</title>
	<atom:link href="http://codeerror.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeerror.wordpress.com</link>
	<description>Estamos de mudança para http://javaerro.globspot.com, em breve &#34;Code Error&#34; deixará de existir...</description>
	<lastBuildDate>Wed, 25 Jan 2012 22:17:17 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codeerror.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Code Error - É errando que se aprende</title>
		<link>http://codeerror.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codeerror.wordpress.com/osd.xml" title="Code Error - É errando que se aprende" />
	<atom:link rel='hub' href='http://codeerror.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Pesquisa em lista, com apelidos fica mais fácil.</title>
		<link>http://codeerror.wordpress.com/2012/01/25/pesquisa-em-lista-com-apelidos-fica-mais-facil/</link>
		<comments>http://codeerror.wordpress.com/2012/01/25/pesquisa-em-lista-com-apelidos-fica-mais-facil/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 22:17:02 +0000</pubDate>
		<dc:creator>codeerror</dc:creator>
				<category><![CDATA[Java Dicas]]></category>
		<category><![CDATA[chave valor]]></category>
		<category><![CDATA[containsKey]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[HashMap]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[mapa]]></category>
		<category><![CDATA[mapeamento]]></category>
		<category><![CDATA[Métodos]]></category>
		<category><![CDATA[put]]></category>
		<category><![CDATA[remove]]></category>
		<category><![CDATA[TreeMap]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://codeerror.wordpress.com/?p=366</guid>
		<description><![CDATA[Continuando com o tema anterior, mas mudando um pouco o foco, agora iremos ver como fazer uma pesquisa em uma lista, sem a necessidade de de criar um algorítimo para tal. Vou apresentar-lhes a forma mais simples de pesquisa (e mais utilizada), em outros posts posso falar sobre as classes de pesquisa mais avançadas ou [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=366&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Continuando com o tema anterior, mas mudando um pouco o foco, agora iremos ver como fazer uma pesquisa em uma lista, sem a necessidade de de criar um algorítimo para tal.</p>
<p>Vou apresentar-lhes a forma mais simples de pesquisa (e mais utilizada), em outros posts posso falar sobre as classes de pesquisa mais avançadas ou você mesmo pode procurá-las depois de possuir o conhecimento inicial.</p>
<p><span style="text-decoration:underline;"><strong>Mapa e Árvore (HashMap e TreeMap).</strong></span></p>
<p>Um mapa, na linguagem Java, consiste em literalmente um <strong>mapa de objetos</strong>, ou seja, você cria um mapa indicando onde seus objetos estão na lista, outro exemplo que podemos utilizar é o índice de um livro, que diz em que página está determinado asunto. Você irá fazer o mesmo, mas indicando em uma lista a posição de cada objeto:</p>
<blockquote><p>O objeto <strong>XYZ</strong> está na posição<strong> 7</strong> da lista.</p></blockquote>
<p>Mas você não precisa fazer todo esse mapeamento sozinho, você precisa apenas mostrar o caminho e o java se vira com o mapeamento.<br />
Depois que o mapa estiver pronto, você só precisa falar para o Java:</p>
<blockquote><p>Ô rapaz, me da o objeto <strong>XYZ</strong>.</p></blockquote>
<p>E você receberá o objeto xyz.</p>
<p>As classes <strong>HashMap</strong> e <strong>TreeMap</strong> no básico são identicas, funcionam da mesma forma, a diferença é que a <strong><em>árvore</em></strong> possui alguns métodos a mais, como identificar o primeiro ou o último item da lista, fazer submapas (tipo substring), enfim, tem algumas funções a mais, porém a pesquisa, para você, vai ser exatamente igual. Eu prefiro utilizar o <strong>HashMap</strong> porque ele costuma ser ligeiramente mais rápido.</p>
<p>Você precisará entender o concento de<span style="color:#ff0000;"><strong> &#8220;chave/valor&#8221;</strong></span>, que é utilizado por todas essas classes de mapa, isso significa que cada objeto seu vai ter um identificador, <strong>um apelido</strong>, que você vai usar para &#8220;pedir&#8221; o objeto. Digamos que você tenha uma lista de um objeto do tipo <strong>Pessoa</strong>, essa classe, a classe Pessoa, possui os atributos nome, idade, cidade, cpf, profissão. Agora pense em como você usaria a frase <em>&#8220;Me dá o objeto XXX&#8221;,</em> para uma lista de Pessoa. Não dá né?<br />
A única coisa que você pode fazer é pedir o objeto <em>que está em determinada posição da lista</em>, ou no nosso exemplo do livro, o texto que está na página 50. Dessa forma você precisaria saber o que existe em cada página ou ler todas as páginas para identificar o texto que você precisa.<br />
Quando definimos um apelido para os objetos (e preparamos um mapa) a coisa fica mais fácil, mas devemos ter muito cuidado, vou repetir, <strong>devemos ter muito cuidado</strong>.<br />
É necessário utilizar para apelido, algum valor que <strong>nunca</strong>, <strong>jamais</strong>, <strong>nem em um milhão de anos</strong>, se repetirá na lista, se por algum motivo você inserir algum objeto cujo &#8220;apelido&#8221; já exista na lista, o objeto antigo será eliminado e será considerado apenas o novo item. Isso vale para o HashMap e para o TreeMap.</p>
<p>Agora que você já entendeu o conceito de &#8220;chave/valor&#8221; ou seja, &#8220;apelido/objeto&#8221;, podemos criar o nosso mapa de Pessoa, mas precisamos escolher qual será o apelido de cada uma das Pessoas da lista. Tem que ser algo que não se repita. Que tal o CPF?</p>
<p>Criação do mapa:</p>
<blockquote>
<pre>Map&lt;Long, Pessoa&gt; mapa = new HashMap&lt;Long, Pessoa&gt;();</pre>
</blockquote>
<p>Para adicionar itens no mapa, utilizamos a função <strong>PUT</strong>, e passamos obviamente a chave (apelido) e depois o valor (objeto), vejamos alguns exemplos:</p>
<blockquote>
<pre>mapa.put(pessoa.getCpf(), pessoa);
mapa.put(11122233344, pessoa);
mapa.put(Long.parseLong("11122233344"), pessoa);</pre>
</blockquote>
<p>O preenchimento do mapa ficaria em algum loop, da mesma forma que você cria suas listas atuamente, se você está lendo as informações de um arquivo (txt), e a cada linha do arquivo é criado um objeto Pessoa, que seria adicionado à uma lista, mas no lugar da lista você adiciona o objeto em um mapa.</p>
<p>Agora vem a parte legal, sempre que você quiser fazer qualquer coisa com qualquer objeto da lista, você não precisa mais ficar percorrendo a lista e verificando se o objeto atual é o que você precisa, agora que estamos trabalhando com mapa, você pode simplesmente trabalhar com o apelido do objeto que você precisa!</p>
<blockquote>
<pre>mapa.get(11122233344);</pre>
</blockquote>
<p>caso queira eliminar o objeto da lista</p>
<blockquote>
<pre>mapa.remove(11122233344);</pre>
</blockquote>
<p>Lembre-se apenas que o apelido informado deve ser exatamente igual ao apelido que existe na lista, caso contrário poderá ser exibido um erro.<br />
Para evitarmos qualquer tipo de erro, como por exemplo o apelido não existir na lista, podemos utilizar a função <strong>containsKey()</strong>. Esse método presente em praticamente todas as classes de mapa, retorna um booleano, informando se o apelido existe ou não na lista, dessa forma conseguimos controlar e evitar erros.</p>
<blockquote>
<pre>if (mapa.<strong>containsKey(11122233344)</strong>) {
     pessoaSelecionada = mapa.get(11122233344);
}
if (mapa.<strong>containsKey(11122233344)</strong>) {
     mapa.remove(11122233344);
}</pre>
</blockquote>
<p>Facil?</p>
<p>O apelido dos seus objetos pode ser de qualquer tipo, desde que não seja um tipo primitivo. Você pode utilizar como apelido um Integer, Long, Double, até String. Só lembre-se de que os apelidos que você escolher não podem se repetir, ou você terá uma lista inconsistente.</p>
<p>Se quiser trabalhar com TreeMap, a utilização é identica, você só precisa mudar a declaração da variável para algo como:</p>
<blockquote>
<pre>TreeMap&lt;Long, Pessoa&gt; tree = new TreeMap&lt;Long,Pessoa&gt;();</pre>
</blockquote>
<p>O TreeMap possui métodos a mais que podem te ajudar de alguma forma, mas a inserção, pesquisa e remoção de conteúdo é identica ao HashMap, não fazendo diferença utilizar um ou outro para listas/funções mais simples.</p>
<p>&nbsp;</p>
<br />Filed under: <a href='http://codeerror.wordpress.com/category/java-dicas/'>Java Dicas</a> Tagged: <a href='http://codeerror.wordpress.com/tag/chave-valor/'>chave valor</a>, <a href='http://codeerror.wordpress.com/tag/containskey/'>containsKey</a>, <a href='http://codeerror.wordpress.com/tag/get/'>get</a>, <a href='http://codeerror.wordpress.com/tag/hashmap/'>HashMap</a>, <a href='http://codeerror.wordpress.com/tag/java/'>Java</a>, <a href='http://codeerror.wordpress.com/tag/map/'>Map</a>, <a href='http://codeerror.wordpress.com/tag/mapa/'>mapa</a>, <a href='http://codeerror.wordpress.com/tag/mapeamento/'>mapeamento</a>, <a href='http://codeerror.wordpress.com/tag/metodos/'>Métodos</a>, <a href='http://codeerror.wordpress.com/tag/put/'>put</a>, <a href='http://codeerror.wordpress.com/tag/remove/'>remove</a>, <a href='http://codeerror.wordpress.com/tag/treemap/'>TreeMap</a>, <a href='http://codeerror.wordpress.com/tag/tutorial/'>Tutorial</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeerror.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeerror.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeerror.wordpress.com/366/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=366&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeerror.wordpress.com/2012/01/25/pesquisa-em-lista-com-apelidos-fica-mais-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/02b68ef9d46353bdc2a23741b35cf1ac?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">codeerror</media:title>
		</media:content>
	</item>
		<item>
		<title>Ordenação &#8211; Do início ao fim (post gigante)</title>
		<link>http://codeerror.wordpress.com/2012/01/24/ordenacao-do-inicio-ao-fim-post-gigante/</link>
		<comments>http://codeerror.wordpress.com/2012/01/24/ordenacao-do-inicio-ao-fim-post-gigante/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 21:01:02 +0000</pubDate>
		<dc:creator>codeerror</dc:creator>
				<category><![CDATA[Java Dicas]]></category>
		<category><![CDATA[collator]]></category>
		<category><![CDATA[Collections]]></category>
		<category><![CDATA[comparable]]></category>
		<category><![CDATA[comparator]]></category>
		<category><![CDATA[compare]]></category>
		<category><![CDATA[compareTo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[Métodos]]></category>
		<category><![CDATA[ordenação]]></category>
		<category><![CDATA[ordenar lista de string]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://codeerror.wordpress.com/?p=361</guid>
		<description><![CDATA[Se você chegou até essa página pelo Google, certamente quer ver logo um exemplo de código para sua aplicação, então primeiro vamos ao código e depois para a explicação, que está muito extensa e detalhada. Se você quiser ler, ou se ocorreu algum problema na adaptação do código para sua aplicação, leia o texto abaixo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=361&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Se você chegou até essa página pelo Google, certamente quer ver logo um exemplo de código para sua aplicação, então primeiro vamos ao código e depois para a explicação, que está muito extensa e detalhada. Se você quiser ler, ou se ocorreu algum problema na adaptação do código para sua aplicação, leia o texto abaixo para entender melhor como as coisas funcionam.</p>
<p><strong>&gt;&gt;  Ordenação simples (Números)</strong></p>
<blockquote>
<pre>Collections.sort(o, new Comparator() {
    public int compare(Object x1, Object x2) {
        Pessoa p1 = (Pessoa) x1;
        Pessoa p2 = (Pessoa) x2;
        if (p1.getIdade() &lt; p2.getIdade()) {
            return -1;
        } else if (p1.getIdade() &gt; p2.getIdade()) {
            return 1;
        } else {
            return 0;
        }
    }
 });</pre>
</blockquote>
<p><strong>&gt;&gt; Ordenação de String  (Lista de String, ou lista de objeto com String).</strong></p>
<blockquote>
<pre>Collections.sort(o, new Comparator() {
    public int compare(Object x1, Object x2) {
        Pessoa p1 = (Pessoa) x1;
        Pessoa p2 = (Pessoa) x2;
        Collator.getInstance().compare(p1.getNome(), p2.getNome());
    }
 });</pre>
</blockquote>
<p>Se apenas o código não te ajudou muito e/ou se você deseja se aprofundar mais no assunto, dedique de 5 a 10 minutos ao texto abaixo, ou um pouco mais de tempo se quiser ir praticando os exemplos.</p>
<p>Enquanto estamos aprendendo a programar (se você seguiu todos os passos direito, antes de linguagem aprendeu lógica), vemos alguns algoritmos de ordenação, como quick sort e bubble sort. Também vemos algorítmos de pesquisa, como busca binária e busca linear. Mas depois que deixamos a lógica de lado e começamos a ver alguma linguagem de programação mais recentes, orientada a objetos, eventos, aspectos ou qualquer coisa do tipo, verificamos que esse tipo de algoritmo não é mais necessário, apenas em alguns casos muito específicos. Isso porque as linguagens de hoje em dia já possuem métodos e códigos muito mais rápidos e performáticos para essas situações.</p>
<p><span id="more-361"></span></p>
<p>Antes de mais nada, precisamos verificar se existe mesmo a necessidade de ordenar a lista na aplicação, afinal, essa lista veio de algum lugar, e se esse lugar for um banco de dados, é muito melhor fazer um &#8220;Order By&#8221; no banco do que passar essa tarefa para o java ou qualquer outra linguagem, não importa se o banco de dados é Oracle, Sql, MySql ou mesmo Mainframe, quase todos os banco de dados possuem um order by, até mesmo o finado Access.<br />
Mas nem sempre podemos contar com um banco de dados, as vezes fazemos programas que lêem arquivos, ou recebem informações por socket, webservice ou até mesmo por digitação do usuário.<br />
Quando precisamos ordenar uma lista que não vem de um banco de dados, ou por algum motivo qualquer o banco de dados não consegue/não pode ordenar a lista, então apelamos para a ordenação no java, mas tome muito cuidado, você não precisa criar um algorítimo para ordenar alguma coisa, a própria linguagem tem ferramentas de ordenação que com certeza serão muito melhores que qualquer algorítimo que eu ou você fizermos (já testei e por melhor que fosse meu algorítimo, o do java sempre era milissegundos mais rápido).</p>
<p>Você já ouviu falar em Comparator? E em Comparable? Acho que também não deve conhecer o Collator?</p>
<p>Pois bem, essas são algumas das classes java que nos auxiliam a ordenar uma lista, pode ser uma lista de tipos primitivos ou uma lista de um objeto qualquer, até mesmo uma lista de objetos diferentes, da para ordenar de tudo.</p>
<p>Em muitos lugares você vai ouvir &#8220;implemente a classe x e sobrescreva o método y&#8221;, mas eu não gosto de fazer isso, eu até faço algumas vezes, mas apenas quando é necessário e apenas quando existir um tipo de ordenação. Deixe-me ser mais claro, imagine que você tem um objeto pessoa, esse objeto tem os atributos nome, idade e cidade. Agora imagine que você tem uma lista de Pessoa (List&lt;Pessoa&gt;), e na sua aplicação o usuário pode escolher ordenação por nome ou por idade ou por cidade.<br />
Para esse caso, se você deixar o seu objeto &#8220;comparável&#8221;, você vai ter que escolher apenas um atributo para ser a chave da ordenação. Para conseguir realizar os três tipos de ordenação você precisará fazer uma gambiarra ou criar outras classes que servem apenas para indicar que a ordenação agora vai ser por idade, ou por cidade.<br />
Por isso que eu não implemento o comparador, só faço isso quando vou utilizá-lo outras vezes, o que quase nunca acontece.</p>
<p>Se eu não implemento o comparador, o que eu faço?<br />
Eu crio o comparador na hora que eu mando o java ordenar.</p>
<p>Mais ou menos assim:</p>
<blockquote><p>Java, ordena para mim essa lista e usa esse novo critério que estou definindo agora. (Igual o seu chefe falando com você).</p></blockquote>
<p>Vamos as explicações práticas!<br />
Primeiro você precisa ter uma lista, de preferencia preenchida.</p>
<blockquote>
<pre>List&lt;Pessoa&gt; p;</pre>
</blockquote>
<p>Depois você precisa chamar o método <span style="color:#ff0000;"><strong>sort</strong></span> da classe <span style="color:#ff0000;"><strong>java.util.Collections</strong></span> e passar para ele a sua lista.</p>
<blockquote>
<pre>Collections.sort(p);</pre>
</blockquote>
<p>Se o seu objeto já é &#8220;comparável&#8221; (veremos isso mais para frente), apenas isso basta, mas se o seu objeto é &#8220;normal&#8221;, possui apenas os atributos e métodos básicos que você mesmo criou, então será necessário informar para o <em>sort</em> qual parâmetro de ordenação você escolheu. Nesse ponto, você informa uma classe de comparação que você criou, ou cria os parametros na hora (o que eu costumo fazer).</p>
<blockquote>
<pre> Collections.sort(p, <span style="color:#ffff99;"><strong>new Comparator()</strong></span>);</pre>
</blockquote>
<p>Até aqui está tranquilo? Entendendo tudo?<br />
Mas se você escrever apenas isso vai dar um erro, dizendo que <strong>não da para instanciar</strong> a classe &#8220;<strong>Comparator</strong>&#8220;. Isso é verdade, mas nosso código não acabou ainda, como eu disse, precisamos criar os parametros de ordenação.<br />
Imagine que criaremos um método alí dentro do sort.</p>
<blockquote>
<pre>Collections.sort(p, <strong>new Comparator() <span style="color:#ffff99;">{ }</span></strong>);</pre>
</blockquote>
<p>Captou a mensagem? Agora precisamos escrever algum método dentro do <strong>new Comparator() { }.</strong><br />
Mas não pode ser um método qualquer, tem que ser o método <span style="color:#ff0000;"><strong>compare</strong></span>, que é utilizado pelo Comparator para estabelecer os parâmetros de ordenação.</p>
<blockquote>
<pre>Collections.sort(o, new Comparator() {
 <span style="color:#ffff99;"><strong>   public int compare(Object x1, Object x2) {}</strong></span>
 });</pre>
</blockquote>
<p>Até aqui tudo entendido?<br />
O método <strong>compare</strong>, da classe <strong>Comparator</strong> fala para o ordenador qual dos dois objetos recebidos é &#8220;<strong>maior</strong>&#8221; e qual é &#8220;<strong>menor</strong>&#8220;, isso você que define.<br />
Agora é que a mágica vai acontecer, o <strong>compare</strong> recebe dois <strong>Objects</strong>, que podem (e vão) ser do tipo da sua lista, então você faz o &#8220;<strong>cast</strong>&#8220;, e compara as variáveis da forma como desejar. Mas calma que não é só isso. Repare no tipo do método compare, ele retorna um int! O que devemos retornar nesse caso?</p>
<blockquote><p><span style="color:#000000;">Se o <strong>objeto</strong> <strong>1</strong> for <strong>MENOR</strong> que o <strong>objeto 2</strong>, então o retorno deve ser<strong> -1</strong></span><br />
<span style="color:#000000;"> Se o <strong>objeto 1</strong> for <strong>MAIOR</strong> que o <strong>objeto 2</strong>, então o retorno deve ser<strong> 1</strong></span><br />
<span style="color:#000000;"> Senão (objetos <strong>iguais</strong>), então o retorno deve ser <strong>0</strong>;</span></p></blockquote>
<p>Guarde muito bem essas informações na sua memória, isso vai ser bem utilizado em praticamente todos os tipos de comparação.</p>
<p>Apenas imagine o seguinte, a posição dos números: &#8230; -3, -2,<strong> <span style="color:#ff0000;">-1</span>, <span style="color:#ff0000;">0</span>, <span style="color:#ff0000;">1</span>,</strong> 2, 3 &#8230;<br />
Qual número está à esquerda? Obviamente o<span style="color:#ff0000;"><strong> -1</strong></span><br />
Qual número está à direita? Novamente óbvio, o número <span style="color:#ff0000;"><strong>1</strong></span><br />
O zero está exatamente no meio dos dois, é &#8220;<span style="color:#ff0000;"><strong>neutro</strong></span>&#8220;, não tem diferença.</p>
<p>Agora imagine os parâmetros: <strong>public int compare(Object <span style="color:#ff0000;">x1</span>, Object <span style="color:#ff0000;">x2</span>)</strong><br />
Pense agora em colocar esses objetos na ordem, o objeto menor fica à esquerda e o maior dica à direita (partindo do primeiro objeto).</p>
<blockquote><p><span style="color:#000000;">O <strong>x1</strong> é <strong>MENOR?</strong> Então ele deve ficar na <strong>esquerda</strong>, então devemos retornar<strong> -1</strong>.</span><br />
<span style="color:#000000;"> O <strong>x1</strong> é <strong>MAIOR?</strong> Então ele deve ficar na <strong>direita</strong>, então devemos retornar <strong>1</strong>.</span></p></blockquote>
<p>Entendeu?<br />
Então vamos colocar em prática.</p>
<blockquote>
<pre>Collections.sort(o, new Comparator() {
    public int compare(Object x1, Object x2) {
        Pessoa p1 = (Pessoa) x1;
        Pessoa p2 = (Pessoa) x2;
       <span style="color:#000000;"><span style="color:#ffff99;"><strong> if (p1.getIdade() &lt; p2.getIdade()) {
</strong> <strong>            return -1;
</strong> <strong>        } else if (p1.getIdade() &gt; p2.getIdade()) {
</strong> <strong>            return 1;
</strong> <strong>        } else {
</strong> <strong>             return 0;
</strong> <strong>        }</strong></span>     }</span>
 });</pre>
</blockquote>
<p>Pronto, o código é esse.<br />
Achou simples? Eu acho que podemos complicar mais!</p>
<p>A comparação acima serve apenas para <strong>Números</strong>. E quando precisamos ordenar <strong>TEXTO</strong>, o que fazer?<br />
Calma, calma, calma, não há necessidade de apelar para algorítimos, deixa o Java fazer o trabalho sujo para você.</p>
<p>Imagine o mesmo princípio da ordenação por número, nós preparamos o ambiente mas agora vamos deixar o<strong> &#8220;IF..ELSE&#8221;</strong> para outro infeliz fazer.<br />
Esse outro infeliz seria o método <span style="color:#ff0000;"><strong>compare</strong></span> da classe <span style="color:#ff0000;"><strong>java.text.Collator</strong></span>, essa classe tem muitas utilidades e vários tipos de ordenação muito legais, mas por enquanto o que nos interessa é a <span style="text-decoration:underline;"><strong>ordenação de texto</strong></span>.<br />
O método compare dessa classe funciona <span style="text-decoration:underline;">exatamente igual</span> ao que fizemos acima, ele recebe dois objetos, para o nosso caso ele recebe duas Strings, e retorna -1, 0 ou 1, exatamente como explicado acima. Então o que devemos fazer é substituir o nosso <strong>&#8220;IF..ELSE&#8221;</strong> pelo pelo <strong>compare</strong> dessa classe.</p>
<blockquote>
<pre>Collections.sort(o, new Comparator() {
     public int compare(Object x1, Object x2) {
         Pessoa p1 = (Pessoa) x1;
         Pessoa p2 = (Pessoa) x2;
         <span style="color:#ffff99;"><strong>Collator.getInstance().compare(p1.getNome(), p2.getNome());</strong></span>
     }
 });</pre>
</blockquote>
<p>Ficou até mais simples&#8230;<br />
O que fizemos aqui foi passar a <strong>Decisão</strong> para outra pessoa (Igual o seu chefe faz com você), no lugar de nós tomarmos a decisão de qual String é maior do que a outra, passamos essa tarefa para o método <em>compare</em> da classe <em>Collator</em>.</p>
<p>Isso é tudo pessoal! Ou melhor, quase tudo.<br />
Fiquei devendo falar das implementações, que eu raramente uso.<br />
Primeiro devo dizer que é raro eu precisar ordenar uma lista, porque trabalhando com banco de dados essa tarefa obviamente não fica com o java, mas quando é necessário ordenar a lista no java dificilmente essa mesma lista precirá ser ordenada novamente, no mesmo modo em outro lugar, mas existem algumas ocasiões em que precisamos ordenar a mesma lista, da mesma forma, na tela <em><strong>a</strong></em>, depois na tela <em><strong>b</strong></em>, e na tela<em><strong> c</strong></em>, etç, etç. Para esses casos é <em>chato</em>, <em>inviável</em> e <strong><em>não recomendável</em></strong> utilizar a ordenação da forma como fiz acima, digo isso porque: Digamos que você fez essa ordenação em 5 lugares diferentes da aplicação, e aplicou esse mesmo código nos cinco lugares. Depois de alguns meses, quase na implantação do projeto, o cliente desiste da ordenação e diz que ficaria melhor de outra forma, então você volta e altera os parâmetros de ordenação, mas você não lembra mais todos os lugares em que a ordenação é realizada, ou pior, você não está mais no projeto, quem vai alterar o código é o novo estagiáro! A casa caiu, certamente alguma(s) das ordenações ficará da forma antiga, o que causará um erro ou insatisfação do cliente, ou os dois.</p>
<p>Pensando nisso, podemos deixar a nossa classe Comparável! Mas o que significa isso? Significa que deixamos uma &#8220;marca&#8221; na nossa classe, dizendo que ela pode ser ordenada!</p>
<p>Vamos voltar à classe Pessoa:</p>
<blockquote>
<pre>class Pessoa {
     private String <strong>nome</strong>;
     privete String <strong>cidade</strong>;
     private int <strong>idade</strong>;
     //Getters e Setters
 }</pre>
</blockquote>
<p>Essa classe é simples, não tem nada de mais.<br />
Podemos escolher um dos atributos para deixá-la <strong>comparável</strong>, no caso vou escolher o &#8220;mais facil&#8221;, onde o controle fica comigo, então vou escolher o inteiro, a idade.</p>
<p>Para marcarmos a classe informando que ela é &#8220;Comparável&#8221;:</p>
<blockquote>
<pre>class Pessoa implements <span style="color:#ffff99;"><strong>Comparable&lt;Pessoa&gt;</strong></span> {}</pre>
</blockquote>
<p>Na declaração da classe acima, dizemos que a classe <strong>Pessoa</strong> é <strong>comparável</strong> com outra classe do tipo <strong>Pessoa</strong>.</p>
<p>Agora precisamos escrever um método chamado <strong>compareTo</strong>, que funcioana exatamente igual ao método compare que vimos acima, porém esse método recebe apenas um objeto, afinal o outro objeto é a própria classe.</p>
<blockquote>
<pre>public int compareTo(Pessoa p) {
     if (this.idade &lt; p.getIdade()) {
         return -1;
     } else if (this.idade &gt; p.getIdade()) {
         return 1;
     } else {
         return 0;
     }
 }</pre>
</blockquote>
<p>Como declaramos que a classe Pessoa é comparável com outro objeto do tipo Pessoa, entõ o nosso método <strong>compareTo</strong> recebe um objeto Pessoa como parâmetro. Se não declararmos na classe o tipo de objeto de comparação, então nosso método compareTo deverá receber um Object, e dentro do método fazemos o cast.</p>
<p>Agora nossa classe está pronta e preparada para ser ordenada por idade, basta você chamar o Collections.sort e ordenar a lista, sem precisar informar nenhum comparador.</p>
<blockquote>
<pre>Collections.sort(lista);</pre>
</blockquote>
<p>Mas e se quisermos criar vários tipos de comparação? Então agora você precisará criar classes de comparação!<br />
<em>Crie um comparador para cada tipo de ordenação que quiser fazer</em>.<br />
No nosso exemplo, já preparamos a classe Pessoa para ser ordenada por idade, agora precisamos ordená-la por nome. Então criamos uma nova classe no nosso projeto e implementamos o <strong>java.util.Comparator</strong>, ao implementar essa classe você será obrigado a escrever o método <strong>compare</strong> e, adivinha? Ele funciona exatamente igual o primeiro compare que escrevemos, deve retornar -1, 0 ou 1.<br />
Esse método vai receber <strong>dois objetos</strong>. Se você declarou o tipo do objeto na assinatura da classe, então o método vai receber o tipo que você refiniu, caso contrário ele vai receber dois Objects.</p>
<blockquote>
<pre>class <strong>ComparadorNome</strong> implements Comparator &lt;Pessoa&gt;{
     public int compare(Pessoa <strong>o1</strong>, Pessoa <strong>o2</strong>) {
         return Collator.getInstance().compare(<strong>o1.getNome()</strong>, <strong>o2.getNome()</strong>);
     }
 }</pre>
</blockquote>
<p>Fácil?<br />
Agora na hora de ordenar, você fala para o Java mais ou menos assim:</p>
<blockquote><p><em>Java, querido amigo, eu quero que você ordene essa lista, eu sei que ela está preparada para ser ordenada por idade, mas eu quero que você utilize esse outro parâmetro que eu encontrei jogado por ali e achei legal.</em></p>
<pre>Isso em código fica dessa forma:

 Collections.sort(lista, new ComparadorNome());</pre>
</blockquote>
<p>Eu optei por deixar a classe preparada para ser ordenada por idade e criar um comparador para nome, mas você pode fazer o contrário, pode fazer o que quiser, com as váriáveis que achar melhor! Agora você já pode ordenar uma lista utilizando o atributo que achar melhor, e quantos atributos quiser.</p>
<p>Se ficou alguma dúvida, ou algum código não funcionou <em>(eu testei!)</em>, pergunta ai.</p>
<br />Filed under: <a href='http://codeerror.wordpress.com/category/java-dicas/'>Java Dicas</a> Tagged: <a href='http://codeerror.wordpress.com/tag/collator/'>collator</a>, <a href='http://codeerror.wordpress.com/tag/collections/'>Collections</a>, <a href='http://codeerror.wordpress.com/tag/comparable/'>comparable</a>, <a href='http://codeerror.wordpress.com/tag/comparator/'>comparator</a>, <a href='http://codeerror.wordpress.com/tag/compare/'>compare</a>, <a href='http://codeerror.wordpress.com/tag/compareto/'>compareTo</a>, <a href='http://codeerror.wordpress.com/tag/java/'>Java</a>, <a href='http://codeerror.wordpress.com/tag/lista/'>lista</a>, <a href='http://codeerror.wordpress.com/tag/metodos/'>Métodos</a>, <a href='http://codeerror.wordpress.com/tag/ordenacao/'>ordenação</a>, <a href='http://codeerror.wordpress.com/tag/ordenar-lista-de-string/'>ordenar lista de string</a>, <a href='http://codeerror.wordpress.com/tag/sort/'>sort</a>, <a href='http://codeerror.wordpress.com/tag/tutorial/'>Tutorial</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeerror.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeerror.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeerror.wordpress.com/361/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=361&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeerror.wordpress.com/2012/01/24/ordenacao-do-inicio-ao-fim-post-gigante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/02b68ef9d46353bdc2a23741b35cf1ac?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">codeerror</media:title>
		</media:content>
	</item>
		<item>
		<title>Acessibilidade, Parte 3 (acho que é a última)</title>
		<link>http://codeerror.wordpress.com/2012/01/17/acessibilidade-parte-3-acho-que-e-a-ultima/</link>
		<comments>http://codeerror.wordpress.com/2012/01/17/acessibilidade-parte-3-acho-que-e-a-ultima/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 22:17:17 +0000</pubDate>
		<dc:creator>codeerror</dc:creator>
				<category><![CDATA[Java Dicas]]></category>
		<category><![CDATA[Acessibilidade]]></category>

		<guid isPermaLink="false">http://codeerror.wordpress.com/?p=356</guid>
		<description><![CDATA[Olá! Depois de muito tempo, consegui finalmente finalizar o final dessa matéria, que aparentemente ficou dividida em três postagens (se esse post realmente for o último). Nos capítulos anteriores você pode ver que muitas imagens pesadas e navegação voltada para o mouse impedem e muito a utilização de seu site, esses dois assuntos são bem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=356&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Depois de muito tempo, consegui finalmente finalizar o final dessa matéria, que aparentemente ficou dividida em três postagens (se esse post realmente for o último).</p>
<p>Nos capítulos anteriores você pode ver que muitas imagens pesadas e navegação voltada para o mouse impedem e muito a utilização de seu site, esses dois assuntos são bem genéricos, ou seja, eles abordam todo tipo de acessibilidade, pode ser deficiência física, motora, equipamento ruim, conexão ruim, celular, qualquer coisa que seja um impedimento para a navegação. A matéria a seguir também é um pouco genérica, na parte de tabelas, mas tem uma parte especial voltada quase que exclusivamente à deficientes visuais, onde me refiro aos leitores de tela.</p>
<p>Vamos começar com tabelas, se estava genérico até agora vamos continuar nesse rumo.<br />
As tabelas no HTML são tão úteis quanto no excel, eu gosto de tabelas, utilizando as tags &lt;table&gt; fica muito mais fácil desenhar e organizar o layout de qualquer site, mas tem um problema, o uso excessivo de tabelas prejudica a navegação e o carregamento da tela.</p>
<p>Em alguns lugares onde ajudei a construir ou manter os sites, seus layouts eram construídos unicamente com tabelas, todo tipo de organização que você possa imaginar. Quer alinhar um item à direita? coloca em uma tabela. Quer escrever um contrato? Tabela neles! Quer organizar um menu, com submenu e sub-submenu? Tabelas e tabelas dentro de tabelas!</p>
<p>Esse tipo de escrita do código faz a página ficar mais lenta para carregar. No seu computador com processador de 16 núcleos 50GB de memória e navegador Chrome isso não vai acontecer, mas voltando à primeira parte dessa matéria, nem todo mundo possui a dádiva de possuir um ótimo navegador, e a maioria dos usuários um pouco mais leigos nem sabem o que é um &#8220;Firefox&#8221; e acham que &#8220;Chrome&#8221; deve ser alguma moda em Paris, essas pessoas usam a &#8220;internet&#8221; que vem no computador, e provavelmente nem sabem o que é atualização ou não se preocupam com isso. Não estou falando mal do navegador da Microsoft, nas últimas versões ele até que está bom, ainda não é melhor que o Chrome ou Firefox, mas está bom. O problema maior está nas versões mais antigas do navegador, como por exemplo a versão 6, que eu vejo em muitos computadores ainda.<br />
Durante os anos os códigos Html, Css e Javascript foram sofrendo melhorias e alterações, e os próprios navegadores foram se modificando para conseguir ler melhor o código fonte escrito, mas isso aconteceu aos poucos.<br />
O que eu quero dizer com esse monte de palavras amontoadas é que possivelmente uma boa parte de seus usuários estarão utilizando computadores antigos e/ou com hardware fraco e softwares tão fracos e antigos quanto a máquina, nesse tipo de situação quando escrevemos um site com várias tabelas dentro de tabelas dentro de tabelas dentro de tabelas, forçamos o navegador e o pobre processador do usuário a ler mais e mais código (desnecessário) deixando o carregamento da página mais pesado.</p>
<p>Como alternativa podemos abusar do CSS, não precisamos eliminar as tabelas do site, isso não é necessário, o problema é quando temos inúmeras tabelas dentro de inúmeras tabelas! Tente se limitar a 2 ou 3 níveis de &lt;table&gt;, mais que isso já começa a ser abuso. Use mais CSS, dessa forma você diminui alguns míseros Kb no tamanho final da sua página (letras no código fonte também contribuem para aumentar o &#8220;peso&#8221; da página sabia?) e também deixa a abertura da página mais rápida.</p>
<p>Pense nisso, e coloque em prática se for necessário.</p>
<p>Continuando no assunto mais mudando quase que completamente o foco, você sabe o que é um leitor de tela? (para entender melhor o leitor de tela é necessário que você leia antes as partes 1 e 2 dessa matéria).<br />
É mais ou menos como o nome diz, um programa que lê a tela para você, mas ele não é totalmente automático, alguns até que são mais inteligentes, mas até eles dependem muito do usuário que está utilizando, usuário esse que ou é um deficiente visual ou um desenvolvedor tentando deixar o site mais acessível. Existem vários leitores de tela, alguns bons outros ruins, alguns grátis e outros que abusam da deficiência da pessoa e cobram uma pequena fortuna. No Brasil os mais famosos (ao menos os que mais li comentários) são o DOSVOX, NVDA e Virtual Vision.<br />
Quando eu estava em projeto acessível utilizava o Virtual Vision para os testes e gostei muito dele, bem personalizável, não consegui me acostumar com o NVDA e nunca testei o DOSVOX, mas esse foi o meu caso, com você pode ser diferente.</p>
<p>Esses leitores de tela até que tentam ser mais inteligentes que os desenvolvedores, a maioria deles tenta ler em alguma ordem os sites mesmo que estes não sejam acessíveis e/ou estejam totalmente bagunçados, mas eles não fazem milagres e como eu disse, eles &#8220;tentam&#8221; ler o site.</p>
<p>Um leitor de tela não lê o site da mesma forma que você está lendo agora, até porque isso é muito difícil e inviável, tecnicamente. O leitor de tela pega o código fonte do site e navega por ele, loucura não é mesmo? Exibe o código fonte do seu site (botão direito do mouse) e tenta ler ou navegar por esse monte de letras e códigos.</p>
<p>Para ajudar os leitores de tela, podemos deixar nosso código fonte organizado, evitar lixos, não usar muitas tabelas, conforme mencionado acima, e principalmente, definir textos alternativos para TUDO!<br />
Um texto alternativo é aquela caixinha de informação que aparece quando você para o mouse sobre algum objeto, essa caixinha não aparece apenas em botões ou links, ela pode aparecer em qualquer lugar, até mesmo em textos e tabelas, para definir esses textos alternativos você pode utilizar os atributos TITLE ou ALT, dependendo da tag ela pode possuir um, outro ou os dois atributos, ai você escolhe qual utilizar, mas sempre utilize a opção de textos alternativos.</p>
<p>Vamos à dois exemplos:<br />
1 &#8211; Digamos que você escreveu um texto e colocou uma imagem no meio do texto, quando o leitor de tela passar por essa imagem ele vai falar para o usuário &#8220;pasta um barra pasta dois barra imagem ponto jota pê gê&#8221;, é isso que sua imagem representa? Acho que não. Se você definir um texto alternativo para essa imagem, o leitor de tela irá falar para o usuário o que você escreveu, por exemplo &#8220;Imagem que mostra um gato com cara de mal pulando sobre um bebe dormindo&#8221;. Eu sei que as vezes isso é um pouco chato e na maioria dos casos o texto não tem graça como a imagem, mas pense em seu leitor deficiente visual, ele vai ficar frustrado se o leitor de tela ser o caminho e o nome da imagem em todas as imagens que estiverem em seu site, se fosse comigo eu não voltaria mais.</p>
<p>2 &#8211; Imagine agora que você colocou um link qualquer no seu site, o leitor de tela vai falar para o usuário mais ou menos assim: &#8220;agá tê tê pê dois pontos barra barra dabliu dabliu dabliu ponto meu site ponto com barra alguma coisa barra outra coisa barra mais alguma coisa barra postagem que eu quero ponto aga tê eme ele&#8221;. Coisa feia né? As vezes nem da para entender. Imagina então se for uma URL abreviada, não da nem para saber para onde o link vai: &#8220;agá tê tê pê dois pontos barra barra migre ponto me barra sete xis nove pê ipsulon agá um erre zê&#8221;. O que é isso? Desse jeito fica difícil navegar. Lembre-se de colocar os textos alternativos! Fazendo isso, seja qual for o leitor de tela que o usuário utilizar, o leitor falará o texto alternativo que você escreveu, ou seja, o que é, pra que serve e pra onde vai aquele link, ex: &#8220;Link para o site tal, para a página que explica como os gatos ninjas destruirão a humanidade em dois mil e doze&#8221;.</p>
<p>Os leitores de tela, alem de precisarem de textos alternativos também precisam de uma boa ordem de navegação, não é obrigatório mas ajuda MUITO se você definir os principais &#8220;tabindex&#8221; do seu site (<a title="Parte 2 da matéria" href="http://codeerror.wordpress.com/2011/03/13/acessibilidade-parte-2/" target="_blank">parte 2</a> da matéria), tente deixar como ordem de navegação primeiro o conteúdo, depois as propagandas, banners, menus, links, etç, etç, afinal se eu entrei no seu site é porque eu quero ver a matéria e não quantos parceiros você tem, pelo menos na maioria dos casos.</p>
<p>O texto já ficou grande mas acho que terminei por aqui, apenas lembre-se de deixar seu site acessível e mais uma vez, acessibilidade não significa apenas deficiência física, pode ser deficiência física, motora, visual, auditiva, máquina velha, conexão ruim, dispositivo portátil, etç, etç, etç.</p>
<p>Lembre-se sempre do <a title="Primeira parte dessa matéria" href="http://codeerror.wordpress.com/2011/01/10/acessibilidade-parte-1/" target="_blank">pior caso possível</a>, e boa sorte!</p>
<br />Filed under: <a href='http://codeerror.wordpress.com/category/java-dicas/'>Java Dicas</a> Tagged: <a href='http://codeerror.wordpress.com/tag/acessibilidade/'>Acessibilidade</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeerror.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeerror.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeerror.wordpress.com/356/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=356&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeerror.wordpress.com/2012/01/17/acessibilidade-parte-3-acho-que-e-a-ultima/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/02b68ef9d46353bdc2a23741b35cf1ac?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">codeerror</media:title>
		</media:content>
	</item>
		<item>
		<title>Estamos de mudança</title>
		<link>http://codeerror.wordpress.com/2011/11/20/estamos-de-mudanca/</link>
		<comments>http://codeerror.wordpress.com/2011/11/20/estamos-de-mudanca/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 14:30:10 +0000</pubDate>
		<dc:creator>codeerror</dc:creator>
				<category><![CDATA[Java Dicas]]></category>

		<guid isPermaLink="false">http://codeerror.wordpress.com/?p=342</guid>
		<description><![CDATA[Olá. Estamos de mudança para um novo endereço, http://javaerro.blogspot.com, em breve este endereço, Code Error, deixará de existir. Aos poucos todos os posts estão sendo migrados, artigos novos serão publicados apenas em Java Erro. Assim que a migração for concluída, esse blog fará apenas o redirecionamento. Devido a falta de tempo e pouca possibilidade de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=342&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá.</p>
<p>Estamos de mudança para um novo endereço, <a title="http://javaerro.blogspot.com" href="http://javaerro.blogspot.com" target="_blank">http://javaerro.blogspot.com</a>, em breve este endereço, Code Error, deixará de existir.<br />
Aos poucos todos os posts estão sendo migrados, artigos novos serão publicados apenas em Java Erro.</p>
<p>Assim que a migração for concluída, esse blog fará apenas o redirecionamento.</p>
<p>Devido a falta de tempo e pouca possibilidade de personalização do wordpress &#8220;gratis&#8221;, foi necessário escolher entre um servidor pago ou algum grátis que me atendesse melhor.</p>
<p>Se você adicionou esse blog em algum tipo de link ou favoritos, por favor, atualize o novo endereço.</p>
<p><strong>ATENÇÃO</strong>: Aos poucos os links desse blog (wordpress) direcionarão para as páginas do novo endereço (blogspot), dessa forma, não se assuste quando algum link abrir o endereço &#8220;javaerro.blogspot.com&#8221;, porque todos os meus movimentos são friamente calculados.</p>
<p>Obrigado!</p>
<br />Filed under: <a href='http://codeerror.wordpress.com/category/java-dicas/'>Java Dicas</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeerror.wordpress.com/342/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeerror.wordpress.com/342/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeerror.wordpress.com/342/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=342&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeerror.wordpress.com/2011/11/20/estamos-de-mudanca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/02b68ef9d46353bdc2a23741b35cf1ac?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">codeerror</media:title>
		</media:content>
	</item>
		<item>
		<title>JavaScript + JSF, ser&#225; que d&#225; certo? (parte 2)</title>
		<link>http://codeerror.wordpress.com/2011/11/17/javascript-jsf-ser-que-d-certo-parte-2/</link>
		<comments>http://codeerror.wordpress.com/2011/11/17/javascript-jsf-ser-que-d-certo-parte-2/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 23:10:21 +0000</pubDate>
		<dc:creator>codeerror</dc:creator>
				<category><![CDATA[Java Dicas]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[tomahawk]]></category>

		<guid isPermaLink="false">http://codeerror.wordpress.com/?p=335</guid>
		<description><![CDATA[Em um outro post sobre JSF + Javascript comentei como manipular os objetos no jsp via javascript, agora vou postar algo ainda mais útil que isso, ainda no quesito gambiarra necessária. Imagine que você tem algumas variáveis de controle em seu código Java, mas precisa que essas variáveis sejam enviadas de alguma forma para o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=335&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Em um <a href="http://codeerror.wordpress.com/2009/05/17/javascript-jsf-sera-que-da-certo/" target="_blank">outro post sobre JSF + Javascript</a> comentei como manipular os objetos no jsp via javascript, agora vou postar algo ainda mais útil que isso, ainda no quesito gambiarra necessária.    <br />Imagine que você tem algumas variáveis de controle em seu código Java, mas precisa que essas variáveis sejam enviadas de alguma forma para o jsp para que você faça alguma ação via javascript, como por exemplo, efetuar uma validação no código Java e se tudo estiver certo continuar a execução, mas se algo estiver errado volta para a tela, exibe uma mensagem e pinta os campos de alguma cor destacando o que está errado. Nesse caso a ação de pintar os campos e até mesmo a mensagem, dependendo da sua aplicação, é uma ação delegada ao javascript.</p>
<p>Mas como fazer para que a minha variável de controle no Java seja enxergada no javascript?</p>
<p>Na minha época de estagiário, eu certamente faria algo do tipo:   <br />Deixa a variável de controle no Bean, adiciona um campo “inputtext” oculto no jsp e faz esse campo receber o valor da variável de controle, via javascript eu mando um getElementById pegar o valor desse campo e começo a utilizar.</p>
<p>Maravilha, gambiarra melhor que essa fica difícil de fazer, nem da vontade de mexer mais no código depois disso, deixa lá para as gerações futuras saberem quem fez essa maravilha de código.</p>
<p>Uma coisa que eu costumo dizer é: Para que ter o trabalho de fazer algo que já fizeram, e provavelmente melhor do que você?</p>
<p>O <strong>Tomahalk</strong> já faz algo do tipo sem precisar ficar colocando campo oculto na tela, não precisa se preocupar mais com essa gambiarra, se preocupe com as outras.</p>
<p>O que iremos fazer é utilizar um comando do tomahalk que pega uma variável qualquer do seu bean e passa o seu valor para uma variável global em javascript (a variável é global mas funciona apenas no jsp em que ela foi declarada). Para utilizar essa “poderosíssima” ferramenta, precisaremos primeiro importar a taglib necessária no jsp, mas não se desespere, se você está utilizando JSF é bem provável que possua esse jar no meio de sua pasta lib.</p>
<p>Importe a seguinte taglib (eu estou chamando apenas de <strong>“T”</strong> para economizar as teclas digitadas):</p>
<blockquote><p>&lt;%@ taglib uri=&quot;http://myfaces.apache.org/tomahawk&quot; prefix=&quot;t&quot;%&gt;</p>
</blockquote>
<p>Agora, em qualquer lugar de seu jsp, mas para ficar menos feio, próximo ao seu javascript, importe a variável que precisa utilizando o comando<strong> t:jsValueSet</strong></p>
<blockquote><p>&lt;t:jsValueSet name=&quot;&quot; value=&quot;&quot;/&gt;</p>
</blockquote>
<p>Em <strong>NAME</strong> você precisa colocar o nome que essa variável terá no javascript, pode ser qualquer coisa, até <em>sorveteDeChocolate</em>, mas será muito mais agradável se colocar um nome que faça referência ao que ela representa.    <br />Em <strong>VALUE</strong> você deve colocar a variável de seu bean.</p>
<p>Ex.: Digamos que eu tenha uma variável de controle em meu bean chamada controleMensagem, essa variável é booleana.</p>
<p><em>NOTA: Os nomes no Java e no javascript podem ser iguais, eu coloquei diferente para não confundir as coisas.</em></p>
<p>Feito isso, agora eu só preciso utilizar a variável no javascript:</p>
<blockquote><p>if (exibeMensagem) {     <br />alert(&quot;preencha direito o campo x!&quot;);      <br />}</p>
</blockquote>
<p>No exemplo acima eu estou utilizando minha variável dentro do IF, porque condiz com o exemplo que eu passei, mas você pode utilizar em qualquer outra situação dentro de qualquer javascript no jsp em que o jsValueSet foi declarado, a variável não precisa nem ser booleana, pode ser de qualquer tipo.</p>
<p>Espero que esse post ajude a eliminar muitas gambiarras em seu código!</p>
<br />Filed under: <a href='http://codeerror.wordpress.com/category/java-dicas/'>Java Dicas</a>, <a href='http://codeerror.wordpress.com/category/javascript/'>JavaScript</a> Tagged: <a href='http://codeerror.wordpress.com/tag/java/'>Java</a>, <a href='http://codeerror.wordpress.com/tag/javascript/'>JavaScript</a>, <a href='http://codeerror.wordpress.com/tag/jsf/'>JSF</a>, <a href='http://codeerror.wordpress.com/tag/jsp/'>JSP</a>, <a href='http://codeerror.wordpress.com/tag/tomahawk/'>tomahawk</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeerror.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeerror.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeerror.wordpress.com/335/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeerror.wordpress.com&amp;blog=7493690&amp;post=335&amp;subd=codeerror&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeerror.wordpress.com/2011/11/17/javascript-jsf-ser-que-d-certo-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/02b68ef9d46353bdc2a23741b35cf1ac?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">codeerror</media:title>
		</media:content>
	</item>
	</channel>
</rss>
