<?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>Glider</title>
	<atom:link href="http://maleiria.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://maleiria.wordpress.com</link>
	<description>Amen, in Javadocs we trust!</description>
	<lastBuildDate>Wed, 18 Mar 2009 17:13:43 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='maleiria.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/358548344116ae7c31ffe082d13ddcbc?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Glider</title>
		<link>http://maleiria.wordpress.com</link>
	</image>
			<item>
		<title>O Blog mudou de endereço</title>
		<link>http://maleiria.wordpress.com/2009/03/18/o-blog-mudou-de-endereco/</link>
		<comments>http://maleiria.wordpress.com/2009/03/18/o-blog-mudou-de-endereco/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 17:12:22 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/2009/03/18/o-blog-mudou-de-endereco/</guid>
		<description><![CDATA[Decidi adoptar um novo Blog engine baseado em java open source para poder parametrizar melhor. O novo site está em mleiria
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=28&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Decidi adoptar um novo Blog engine baseado em java open source para poder parametrizar melhor. O novo site está em <a href="http://mleiria.pt.vu">mleiria</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=28&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2009/03/18/o-blog-mudou-de-endereco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Calculadora RPN</title>
		<link>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/</link>
		<comments>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 11:23:57 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[reverse polishnotation]]></category>
		<category><![CDATA[rpn]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=22</guid>
		<description><![CDATA[Uma expressão aritmética está em notação postfix (também chamada reverse polish notation ou RPN)se cada operador for colocado depois dos seus operandos. Por exemplo 3*(4+5) fica 3 4 5 + *. A notação 3*(4+5) chama-se infix. As expressões quando estão em notação postfix, são mais fáceis de serem processadas pelos computadores do que as expressões [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=22&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Uma expressão aritmética está em notação postfix (também chamada <a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation">reverse polish notation</a> ou <i>RPN</i>)se cada operador for colocado depois dos seus operandos. Por exemplo 3*(4+5) fica 3 4 5 + *. A notação 3*(4+5) chama-se infix. As expressões quando estão em notação postfix, são mais fáceis de serem processadas pelos computadores do que as expressões infix.<br />
A seguinte classe processa expressões <i>rpn</i> e efectua as respectivas operações aritméticas. O centro nevrálgico do programa é o interface <b>Deque</b> e a classe <b>ArrayDeque</b>. Um deque é uma queue com duas saídas, ou seja, é uma estrutura linear que permite inserções e remoções só  nos dois extremos (<a href="http://java.sun.com/javase/6/docs/api/java/util/Deque.html">Deque</a>).<br />
Então, temos:</p>
<pre>
/**
 * Esta classe faz o parsing de expressões em postfix
 * (reverse polish notation)
 * e efectua as respectivas operações aritméticas
 *
 * @author Manuel
 *
 */
public class RPNCalculator {

	private static Deque stack =
		new ArrayDeque();
	/**
	 *
	 * @param input
	 */
	public static void calculate(String input) {
		char ch = input.charAt(0);
		if (ch == '+' || ch == '-' || ch == '*'
			|| ch == '/') {
			double y =
			  Double.parseDouble(
                                          stack.pop());
			double x =
			  Double.parseDouble(
			    stack.pop());
			double z = 0.0;
			switch (ch) {
			case '+':
				z = x + y;
				break;
			case '-':
				z = x - y;
				break;
			case '*':
				z = x * y;
				break;
			case '/':
				z = x / y;
				break;
			}
			System.out.printf
			  ("\t%.2f %c %.2f = %.2f%n",
			    x, ch, y, z);
			stack.push(new Double(z).toString());
		} else {
			stack.push(input);
		}
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (true) {
			String input = in.nextLine();
			calculate(input);
			if(input.equalsIgnoreCase("q"))
				break;
		}
	}
}
</pre>
<p>A parte chata é que para fazer uma qualquer operação, temo primeiro que converter a expresão para a sua correspondente versão RPN. Segue um programa que faz isso mesmo:</p>
<pre>
public class ConvertInfixToPostfix {

	public static void main(String[] args){

		Deque stack =
			new ArrayDeque();
		String line =
			new Scanner(System.in).nextLine();
		System.out.println(line);
		Scanner scanner = new Scanner(line);
		while(scanner.hasNext()){
			if(scanner.hasNextInt()){
				System.out.print(
				  scanner.nextInt() + " ");
			}else{
				String str = scanner.next();
				if("+-*/".indexOf(str) &gt;= 0){
					stack.push(str);
				}else if(str.equals(")")){
				  System.out.print(
				    stack.pop() + " ");
				}
			}
		}
		while(!stack.isEmpty()){
			System.out.print(stack.pop() + " ");
		}
		System.out.println();
	}
}</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=22&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Dicas: pesquisa binária e pesquisa sequêncial</title>
		<link>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/</link>
		<comments>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 11:42:24 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[algoritmos]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=20</guid>
		<description><![CDATA[
/**
 * Pesquisa um numero x num array ordenado.É
 * muito mais eficiente do que a pesquisa sequencial
 * mas requer que os elementos do array estejam ordenados.
 * Ele repetidamente divide a sequência em dois e em cada
 * vez restringe a pesquisa à metade que contém o elemento.
 *
 * Este algoritmo corre [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=20&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><pre>
/**
 * Pesquisa um numero x num array ordenado.É
 * muito mais eficiente do que a pesquisa sequencial
 * mas requer que os elementos do array estejam ordenados.
 * Ele repetidamente divide a sequência em dois e em cada
 * vez restringe a pesquisa à metade que contém o elemento.
 *
 * Este algoritmo corre no tempo O(log(n)) o que quer dizer que
 * em média, o tempo de execução é proporcional ao logaritmo
 * do número de elementos no array.
 *
 *
 * @return o indice do numero x ou -1 se não encontrou
 */
public int binarySearch(int[] a, int x){

	int low = 0;
	int high = a.length;

	while(low &lt; high){
		int i = (low + high) / 2;
		if(a[i] == x){
			return i;
		}else if(a[i] &lt; x){
			low = i + 1;
		}else{
			high = i;
		}
	}
	return -1;
}
/**
 * Pesquisa sequencial (ou pesquisa linear) é o algoritmo
 * de pesquisa mais simples mas também é o menos eficiente.
 * Ele examina cada elemento sequencialmente começando
 * pelo primeiro elemento até chegar ao fim do array(se
 * eu estiver à procura de alguém num combóio, utilizo a
 * pesquisa sequencial)
 *
 * Este algoritmo corre no tempo O(n) o que quer dizer que
 * em média, o tempo de execução é proporcional ao número
 * de elementos no array.
 *
 * @return o indice do elemento a pesquisar ou 0 se não
 * o encontrar
 */
public int sequentialSearch(int[] a, int x){
	for(int i = 0, n = a.length; i &lt; n; i++){
		if(a[i] == x){
			return i;
		}
	}
	return -1;
}
/**
 * O algoritmo de binarysearch pode encontrar elementos rapidamente
 * num array que já está ordenado o que sugere que devamos ter os
 * elementos ordenados no array.No entanto, inserir novos elementos
 * num array ordenado é difícil pois temos de transladar os elementos
 * maiores para arranjar espaço para o novo elemento.Podemos faze-lo
 * assim:
 * @param a o array
 * @param n o numero de elementos que já estão ordenados no array
 * @param x o elemento a ser inserido no meio dos elementos
 */
void insert(int[] a, int n, int x){
  /**PreCondicao: a[0] &lt;= ... &lt;= a[n-1], e n &lt; a.length */
  /**PosCondicao: a[0] &lt;= ... &lt;= a[n], e x está entre eles */
  int i = 0;
  while(i &lt; n &amp;&amp; a[i] &lt;= x){
  	i++;
  }
  System.arraycopy(a, i, a, i+1, n-i);
  a[i] = x;
}
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/20/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/20/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=20&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Brincadeiras matemáticas 2</title>
		<link>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/</link>
		<comments>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 07:05:12 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[probabilidades]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=17</guid>
		<description><![CDATA[Este também é interessante:
Provar que qualquer número a é igual a um número menor b:
Sejam a, b, c quaisquer números tais que

a = b + c

então, multiplicando os dois lados por a &#8211; b, obtemos

a (a &#8211; b) = (b + c)(a &#8211; b)
a^2 -ab = ba &#8211; b^2 + ca &#8211; cb

passemos ac para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=17&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Este também é interessante:</p>
<p>Provar que qualquer número <em>a</em> é igual a um número menor <em>b</em>:<br />
Sejam <em>a, b, c</em> quaisquer números tais que<br />
<em><br />
a = b + c<br />
</em><br />
então, multiplicando os dois lados por <em>a &#8211; b</em>, obtemos<br />
<em><br />
a (a &#8211; b) = (b + c)(a &#8211; b)<br />
a^2 -ab = ba &#8211; b^2 + ca &#8211; cb<br />
</em><br />
passemos <em>ac</em> para o lado esquerdo,<br />
<em><br />
a^2 &#8211; ab -ac = ab &#8211; b^2 &#8211; bc<br />
</em><br />
factorizar,<br />
<em><br />
a(a &#8211; b &#8211; c) = b(a &#8211; b &#8211; c)<br />
</em><br />
dividindo ambos os lados por <em>a &#8211; b &#8211; c</em> obtemos</p>
<p><em>a = b</em></p>
<p>e esta?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=17&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Brincadeiras matemáticas</title>
		<link>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/</link>
		<comments>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 12:43:21 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[probabilidades]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=16</guid>
		<description><![CDATA[Eu tenho dois filhos e pelo menos um deles é rapaz.Qual é a probabilidade do outro ser rapaz?
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=16&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Eu tenho dois filhos e pelo menos um deles é rapaz.Qual é a probabilidade do outro ser rapaz?</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=16&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Singleton: duas abordagens</title>
		<link>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/</link>
		<comments>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/#comments</comments>
		<pubDate>Thu, 15 May 2008 18:52:15 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=15</guid>
		<description><![CDATA[Um Singleton é uma classe que só pode ser instanciada exactamente uma vez.
Temos duas abordagens possíveis. Em ambas mantemos o construtor privado e providenciamos membros to tipo public static de forma a que os clientes
possam aceder a uma e uma só instância da classe.


O membro public static é uma variável do tipo final:

//Singleton com uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=15&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Um <i>Singleton</i> é uma classe que só pode ser instanciada exactamente uma vez.<br />
Temos duas abordagens possíveis. Em ambas mantemos o construtor privado e providenciamos membros to tipo <i>public static</i> de forma a que os clientes<br />
possam aceder a uma e uma só instância da classe.</p>
<ol>
<li>
O membro <i>public static</i> é uma variável do tipo <i>final</i>:<br />
<code><br />
//Singleton com uma variável final<br />
public class A {<br />
  public static final A INSTANCE = new A();<br />
  private A() {}<br />
}<br />
</code><br />
O construtor privado é chamado uma única vez para inicializar a variável <font color="gray">A.INSTANCE</font> que é do tipo <i>public static final</i>.
</li>
<li>
Providenciamos um método do tipo <i>public static</i> em vez da variável.<br />
<code><br />
// Singleton with static factory<br />
public class A {<br />
private static final A INSTANCE = new A();<br />
  private A() {}<br />
  public static A getInstance() {<br />
    return INSTANCE;<br />
  }<br />
}<br />
</code><br />
Todas as chamadas ao método estático <font color="gray">a.getInstance()</font><br />
retornam uma referência ao mesmo objecto e não é possível criar mais nenhuma<br />
instância de <font color="gray">A</font>
</li>
</ol>
<p>A primeira abordagem deverá ser usada se tivermos a certeza absoluta que a classe<br />
<font color="gray">A</font> será um <i>Singleton</i> para toda a vida enquanto que<br />
a segunda abordagem dá-nos alguma flexibilidade no código, no sentido em que<br />
agora a classe é do tipo <i>Singleton</i> mas mais tarde poderemos alterar esta<br />
propriedade sem termos que alterar a API.
<p>
Uma nota sobre a serialização de <i>Singletons</i>:para tornarmos uma classe<br />
<i>singleton serializable</i>, não é condição suficiente implementar o<br />
<i>interface Serializable</i> á declaração da classe, i.e.,<br />
<font color="gray">public class A implements Serializable</font>, temos de<br />
implementar o método <font color="gray">readResolve()</font> caso contrário,<br />
cada deserialização da instância irá resultar na criação de uma nova instância.<br />
Para prevenir isto, deveremos adicionar o seguinte método à classe<br />
<font color="gray">A</font>:<br />
<code><br />
// metodo readResolve para preservar a propriedade singleton<br />
private Object readResolve() throws ObjectStreamException {<br />
  /*<br />
  * Retorna a unica classe A e deixa o garbage colector<br />
  * tratar do resto<br />
  */<br />
  return INSTANCE;<br />
}<br />
</code> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=15&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Redimensionar um array</title>
		<link>http://maleiria.wordpress.com/2008/05/14/redimensionar-um-array/</link>
		<comments>http://maleiria.wordpress.com/2008/05/14/redimensionar-um-array/#comments</comments>
		<pubDate>Wed, 14 May 2008 16:17:27 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[redimensionar]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=14</guid>
		<description><![CDATA[Como redimensionar um array? Antes mais aconselho a darem uma vista de olhos pela 
Collections framework e verem se há algo que satisfaça os requisitos (e.g. ArrayList
. Não há? Então vamos a isto:

public class Main {
/**
 * @param args
 */
public static void main(String[] args) {
  //Defino um array com 4 elementos
  String[] names [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=14&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Como redimensionar um array? Antes mais aconselho a darem uma vista de olhos pela <font color="gray"><br />
Collections</font> framework e verem se há algo que satisfaça os requisitos (e.g. <font color="gray">ArrayList</font><br />
</font>. Não há? Então vamos a isto:<br />
<code><br />
public class Main {<br />
/**<br />
 * @param args<br />
 */<br />
public static void main(String[] args) {</p>
<p>  //Defino um array com 4 elementos<br />
  String[] names = new String[4];<br />
  names[0] = "ana";<br />
  names[1] = "ines";<br />
  names[2] = "carolina";<br />
  names[3] = "alice";</p>
<p>  /**<br />
   * Mas agora por alguma razao recebo a informacao<br />
   * de que preciso mais um nome<br />
   * A solucao e realocar o array, criando uma estrutura dinamica<br />
   */<br />
  String anotherName = "sofia";</p>
<p>  //Criar um array temporario<br />
  String[] tmp = new String[names.length + 1];</p>
<p>  //Copiar o array names para o array tmp<br />
  System.arraycopy(names, 0, tmp, 0, names.length);</p>
<p>  //Copiar a referencia do array tmp para o array names<br />
  names = tmp;	//o array tmp esta pronto para ser garbage collected</p>
<p>  //A ultima casa do array names esta vazia.Adicionar a String<br />
  names[names.length-1] = anotherName;</p>
<p>  //Vamos ver o resultado<br />
  for(String name: names)<br />
  	System.out.println(name);<br />
}<br />
}<br />
</code><br />
O resultado é o esperado:<br />
<code><br />
ana<br />
ines<br />
carolina<br />
alice<br />
sofia<br />
</code></p>
<p>Nota final: esta técnica funciona bem para estruturas lineares simples mas para<br />
estruturas mais complexas aconselho vivamente o uso de <font color="gray">ArrayList</font><br />
Em vez de <font color="gray">System.arraycopy()</font> poderia ter utilizado um ciclo<br />
<font color="gray">for</font> mas <font color="gray">System.arraycopy()</font> é mais<br />
rápido por ser implementado em código nativo. </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=14&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/05/14/redimensionar-um-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Uso da memória pelos programas Java</title>
		<link>http://maleiria.wordpress.com/2008/05/12/uso-da-memoria-pelos-programas-java/</link>
		<comments>http://maleiria.wordpress.com/2008/05/12/uso-da-memoria-pelos-programas-java/#comments</comments>
		<pubDate>Mon, 12 May 2008 12:26:48 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[stack]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=12</guid>
		<description><![CDATA[As instruções de um programa a correr são temporariamente armazenados na memória do computador. Não é necessário o programador preocupar-se com a gestão da memória(coisa que não acontece em outras linguagens tais como o C ou C++): a JVM e o garbage collector tratam do assunto. Todavia ajuda sabermos onde são armazenados os dados na [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=12&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As instruções de um programa a correr são temporariamente armazenados na memória do computador. Não é necessário o programador preocupar-se com a gestão da memória(coisa que não acontece em outras linguagens tais como o C ou C++): a JVM e o garbage collector tratam do assunto. Todavia ajuda sabermos onde são armazenados os dados na memória para termos uma melhor compreensão de como os objectos são criados. Consideremos a seguinte figura:
<p>
<a href="http://maleiria.files.wordpress.com/2008/05/image001.jpg"><img src="http://maleiria.files.wordpress.com/2008/05/image001.jpg?w=300&#038;h=129" alt="" width="300" height="129" class="alignnone size-medium wp-image-13" /></a><br />
Há duas áreas distintas onde os dados de um programa são armazenados: stack e heap são duas formas (ou sítios) diferentes de armazenar em memória os elementos de um programa que está em execução.<br />
<strong>Viver na Stack</strong><br />
Os seguintes elementos vivem na stack: Variáveis locais: as variáveis de tipos primitivos definidas dentro de um método ou como parâmetrosde um método.<br />
Referências de variáveis locais:as variáveis que se referem a um objecto e são definidas dentro de um método ou como parâmetros de um método. Um objecto cuja variável local se refere vive na heap.<br />
Invocações a métodos: quando invocamos um método, esse método é empurrado para a stack (i.e., é colocado no topo da stack<br />
As variáveis locais vivem dentro do método e o seu alcance retringe-se ao método. Quando a execução do método termina, as variáveis locais desaparecem mas os objectos, cujas variáveis locais eventualmente se referem, continuam vivos na heap.<br />
<strong>Viver na Heap</strong><br />
Os seguintes elementos vivem na heap:<br />
Variáveis de instância: as variáveis de tipos primitivos definidas dentro da classe mas fora dos métodos.<br />
Referências a variáveis de instância: as variáveis que se referem a um objecto e são definidas dentro da classe mas fora dos métodos.<br />
Objectos: Todos os objectos vivem na heap</p>
<p>Resumindo: variáveis locais (primitivas ou referências) pertencem a métodos e vivem na stack enquanto que uma variável de instância pertence a um objecto e vive na heap. Todavia, uma referência de uma variável local na stack aponta para um objecto na heap e o objecto não morre com a morte da referência.<br />
Os objectos que estão na heap que não estão a ser utilizados são, eventualmente, destruídos por um programa que se chama garbage collector de forma a libertar memória </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=12&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/05/12/uso-da-memoria-pelos-programas-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>

		<media:content url="http://maleiria.files.wordpress.com/2008/05/image001.jpg?w=300" medium="image" />
	</item>
		<item>
		<title>Comparar Objectos com o Comparator</title>
		<link>http://maleiria.wordpress.com/2008/04/23/comparar-objectos-com-o-comparator/</link>
		<comments>http://maleiria.wordpress.com/2008/04/23/comparar-objectos-com-o-comparator/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 21:10:04 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Comparator]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=9</guid>
		<description><![CDATA[Tal como vimos no post anterior, ao implementarmos o interface Comparable, estamos a definir uma forma de comparar instâncias da classe
(no exemplo dado, o objectivo era criar uma lista de objectos Person ordenados por ordem de idades).
No entanto eu posso querer ter a flexibilidade de poder comparar objectos usando mais do que um critério (por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=9&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Tal como vimos no post anterior, ao implementarmos o interface <span style="color:#808080;">Comparable</span>, estamos a definir uma forma de comparar instâncias da classe<br />
(no exemplo dado, o objectivo era criar uma lista de objectos <span style="color:#808080;">Person</span> ordenados por ordem de idades).<br />
No entanto eu posso querer ter a flexibilidade de poder comparar objectos usando mais do que um critério (por exemplo, para uns<br />
casos eu quero comparar idades mas noutros eu quero comparar os primeiros nomes). Resumindo, para criar objectos comparaveis<br />
de duas formas diferentes, preciso de dois comparadores.</p>
<p>Procedimento:</p>
<p>criar um class que implementa o interface <span style="color:#808080;">java.util.Comparator</span>. Este interface tem um método:<br />
<span style="color:#808080;">compare</span> com a seguinte assinatura:</p>
<pre>	public int compare(Object o1, Object o2)</pre>
<p>e retorna zero se <span style="color:#808080;">o1</span> e <span style="color:#808080;">o2</span> forem iguais, um inteiro negativo se <span style="color:#808080;">o1</span><br />
for menor do que <span style="color:#808080;">o2</span> e um inteiro positivo se <span style="color:#808080;">o1</span> for maior do que <span style="color:#808080;">o2</span>.</p>
<p>Tal como no método <span style="color:#808080;">compareTo</span> do interface <span style="color:#808080;">Comparable</span>, somos nós que decidimos qual<br />
o critério que faz com que um objecto seja maior, igual ou menor do que o outro.</p>
<p>Continuando o exemplo do outro post, temos a class <span style="color:#808080;">Person</span><br />
que implementa o interface <span style="color:#808080;">Comparable</span>:</p>
<pre>public class Person implements Comparable {
	private String firstName;

	private String lastName;

	private int age;

	public String getFirstName() {
		return firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public int getAge() {
		return age;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int compareTo(Object anotherPerson)
	throws ClassCastException {
	  if (!(anotherPerson instanceof Person))
	    throw new ClassCastException
               ("Objecto do tipo Person esperado!");
	    int anotherPersonAge = ((Person) anotherPerson).getAge();
	    return this.age - anotherPersonAge;
	  }
}</pre>
<p>Até aqui nada de novo. Agora vou criar uma nova classe que implementa o interface <span style="color:#808080;">Comparator</span><br />
de forma a poder comparar objectos pelo último nome:</p>
<pre>import java.util.Comparator;

public class LastNameComparator implements Comparator {

  public int compare(Object person, Object anotherPerson) {
    String lastName1 =
      ((Person)person).getLastName().toUpperCase();
    String lastName2 =
      ((Person)anotherPerson).getLastName().toUpperCase();
    return lastName1.compareTo(lastName2);

  }
}</pre>
<p>e o mesmo para comparar o primeiro nome:</p>
<pre>import java.util.Comparator;

public class FirstNameComparator implements Comparator {
  public int compare(Object person, Object anotherPerson) {
    String firstName1 =
      ((Person)person).getFirstName().toUpperCase();
    String firstName2 =
      ((Person)anotherPerson).getFirstName().toUpperCase();
  return firstName1.compareTo(firstName2);
  }
}</pre>
<p>Vamos carregar um array com objectos do tipo<br />
<span style="color:#808080;">Person</span><br />
e ordenar de diferentes formas:</p>
<pre>public static void main(String[] args) {
	Person[] persons = new Person[3];
	persons[0] = new Person();
	persons[0].setFirstName("Marcus");
	persons[0].setLastName("Miller");
	persons[0].setAge(43);

	persons[1] = new Person();
	persons[1].setFirstName("Stanley");
	persons[1].setLastName("Clark");
	persons[1].setAge(35);

	persons[2] = new Person();
	persons[2].setFirstName("Jaco");
	persons[2].setLastName("Pastorious");
	persons[2].setAge(38);
	//Antes
	System.out.println("--Ordem natural");
	for(int i = 0; i  Ordenado por idade");
	for(int i = 0; i  Ordenado por primeiro nome");
	for(int i = 0; i  Ordenado por �ltimo nome");
	for(int i = 0; i &lt; persons.length; i++){
		System.out.println(persons[i].getFirstName()
                   + ", " + persons[i].getLastName() + "," +
                persons[i].getAge());
	}
}</pre>
<p>e o resultado é o esperado:</p>
<pre>e o resultado é o esperado:
<pre>--Ordem natural
Marcus, Miller,43
Stanley, Clark,35
Jaco, Pastorious,38
--&gt; Ordenado por idade
Stanley, Clark,35
Jaco, Pastorious,38
Marcus, Miller,43
--&gt; Ordenado por primeiro nome
Jaco, Pastorious,38
Marcus, Miller,43
Stanley, Clark,35
--&gt; Ordenado por �ltimo nome
Stanley, Clark,35
Marcus, Miller,43
Jaco, Pastorious,38</pre>
<p>Se não quiser criar várias classes para os comparadores,<br />
posso fazê-las inner classes da classe <span style="color:#808080;">Person</span></p>
<pre>public class Person implements Comparable{
	private String firstName;
	private String lastName;
	private int age;

	public String getFirstName() {
		return firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public int getAge() {
		return age;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int compareTo(Object anotherPerson)
                              throws ClassCastException{
	  if(!(anotherPerson instanceof Person))
	    throw new ClassCastException
                   ("Objecto do tipo Person esperado!");
	    int anotherPersonAge = ((Person)anotherPerson).getAge();
	    return this.age - anotherPersonAge;
	}

	public static Comparator LastNameComparator =
               new Comparator(){
  	public int compare(Object person, Object anotherPerson) {
	  String lastName1 =
                 ((Person)person).getLastName().toUpperCase();
	 String lastName2 =
                ((Person)anotherPerson).getLastName().toUpperCase();
  	return lastName1.compareTo(lastName2);
	 }
	}
	public static Comparator FirstNameComparator =
              new Comparator(){
  	public int compare(Object person, Object anotherPerson) {
	  String firstName1 =
                ((Person)person).getFirstName().toUpperCase();
	  String firstName2 =
                 ((Person)anotherPerson).getFirstName().toUpperCase();
  	return firstName1.compareTo(lastName2);
             }
          }
}</pre>
<p>o que torna o código mais fácil de manter!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/9/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/9/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=9&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/04/23/comparar-objectos-com-o-comparator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Comparar Objectos</title>
		<link>http://maleiria.wordpress.com/2008/04/23/comparar-objectos/</link>
		<comments>http://maleiria.wordpress.com/2008/04/23/comparar-objectos/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 12:36:46 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[comparable]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=8</guid>
		<description><![CDATA[Muitas vezes preciso de ir à base de dados e preencher listas (ou arrays) com objectos do tipo VO
(View Objects) para depois mostrar numa página web. Tenho necessidade de ordenar essa
lista baseado num critério qualquer. Supponhamos a seguinte situação: na base de dados
há uma tabela de pessoas com as colunas firstName, lastName, e age
e quero [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=8&subd=maleiria&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muitas vezes preciso de ir à base de dados e preencher listas (ou arrays) com objectos do tipo VO<br />
(View Objects) para depois mostrar numa página web. Tenho necessidade de ordenar essa<br />
lista baseado num critério qualquer. Supponhamos a seguinte situação: na base de dados<br />
há uma tabela de pessoas com as colunas <em>firstName</em>, <em>lastName</em>, e <em>age</em><br />
e quero prencher uma lista com objectos do tipo <em>Person</em>:</p>
<pre>
public class Person {
	private String firstName;
	private String lastName;
	private int age;

	public String getFirstName() {
		return firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public int getAge() {
		return age;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
</pre>
<p>Suponhamos agora que tenho um <i>Array</i> carregado com objectos do tipo <i>Person</i><br />
(com 3 objectos, por exemplo):</p>
<pre>
 /**
 * Hardcoded mas normalmente vem da base de dados sob a forma de resultset
 */
 		Person[] persons = new Person[3];
		persons[0] = new Person();
		persons[0].setFirstName("Marcus");
		persons[0].setLastName("Miller");
		persons[0].setAge(43);

		persons[1] = new Person();
		persons[1].setFirstName("Stanley");
		persons[1].setLastName("Clark");
		persons[1].setAge(35);

		persons[2] = new Person();
		persons[2].setFirstName("Jaco");
		persons[2].setLastName("Pastorious");
		persons[2].setAge(38);
</pre>
<p>Portanto, o que eu quero é ordenar este array por, digamos, primeiro nome ou idade.<br />
Se utilizar o método <font color="gray">sort</font> da classe <font color="gray">java.util.Arrays</font>:</p>
<pre>
		 Arrays.sort(persons);
</pre>
<p>não funciona (envia uma excepção do tipo <font color="gray">ClassCastException</font>.<br />
Naturalmente que posso escrever um algorítmo específico (tipo bubble sort) para ordenar<br />
o array mas esta solução não é prática. A solução correcta passa por utilizar<br />
o <font color="gray">java.lang.Comparable</font> interface. Implementando este interface,<br />
torno as instâncias das classes comparáveis de acordo com critérios por mim definidos.</p>
<p>Vamos, então, implementar o interface <font color="gray">Comparable</font>. Este interface tem um<br />
método, <font color="gray">CompareTo</font>, que determina como comparar duas instâncias<br />
da classe. A sua assinatura é:</p>
<pre>
		 public int CompareTo(Object o)
</pre>
<p>que aceita como argumento um <font color="gray">Object</font>. Claro que só faz<br />
sentido comparar instâncias do mesmo tipo. Podemos ver, também, que retorna um<br />
inteiro que é igual a zero se o objecto passado é igual a esta instância e retorna<br />
um inteiro positivo ou negativo se este objecto é maior ou menor do que o objecto<br />
passado, respectivamente. Suponhamos que o critério de ordenação é a idade da pessoa:<br />
A nossa classe <font color="gray">Person</font> fica assim:</p>
<pre>
public class Person implements Comparable{
	private String firstName;
	private String lastName;
	private int age;

	public String getFirstName() {
		return firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public int getAge() {
		return age;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int compareTo(Object anotherPerson) throws ClassCastException{
		if(!(anotherPerson instanceof Person))
			throw new ClassCastException("Objecto do tipo Person esperado!");
		int anotherPersonAge = ((Person)anotherPerson).getAge();
		return this.age - anotherPersonAge;
	}
}
</pre>
<p>Assim, se quiser ordenar o array por idades crescente, só tenho de fazer<br />
<font color="gray">Arrays.sort(Person)</font>.<br />
Podemos testar:</p>
<pre>
public static void main(String[] args) {
		Person[] persons = new Person[3];
		persons[0] = new Person();
		persons[0].setFirstName("Marcus");
		persons[0].setLastName("Miller");
		persons[0].setAge(43);

		persons[1] = new Person();
		persons[1].setFirstName("Stanley");
		persons[1].setLastName("Clark");
		persons[1].setAge(35);

		persons[2] = new Person();
		persons[2].setFirstName("Jaco");
		persons[2].setLastName("Pastorious");
		persons[2].setAge(38);
		System.out.println("ORDEM NATURAL:");
		for(int i = 0; i &lt; persons.length; i++){
			System.out.println(persons[i].getFirstName() + ", " +
                        persons[i].getLastName() + "," + persons[i].getAge());
		}
		Arrays.sort(persons);
		System.out.println("ORDENADO POR IDADE");
		for(int i = 0; i &lt; persons.length; i++){
			System.out.println(persons[i].getFirstName() + ", " +
                        persons[i].getLastName() + "," + persons[i].getAge());
		}
}
</pre>
<p>e o output é o esperado:</p>
<pre>
ORDEM NATURAL:
Marcus, Miller,43
Stanley, Clark,35
Jaco, Pastorious,38
ORDENADO POR IDADE
Stanley, Clark,35
Jaco, Pastorious,38
Marcus, Miller,43
</pre>
<p>Se quiser ordenar, não por idade mas por, digamos, primeiro nome, só tenho de<br />
adaptar o meu método <font color="gray">CompareTo</font>:</p>
<pre>
	public int compareTo(Object anotherPerson) throws ClassCastException{
		if(!(anotherPerson instanceof Person))
			throw new ClassCastException("Objecto do tipo Person esperado!");
		String anotherPersonFirstName = ((Person)anotherPerson).getFirstName();
		return this.firstName.compareTo(anotherPersonFirstName);
	}
</pre>
<p>E se eu quiser ter alguma flexibilidade no código para ordenar ou por idade, ou<br />
por primeiro nome ou por último nome, conforme a situação? isso será matéria<br />
para o próximo post (iremos implementar o <i>interface</i> <font color="gray">java.util.Comparator</font> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&blog=3539639&post=8&subd=maleiria&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/04/23/comparar-objectos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
	</channel>
</rss>