[Ajuda] - Exercicios Caelum FJ11

16 respostas
acidotherwise
  1. Atenção especial: repare que escrevemos um método compareTo em nossa classe e nosso código nunca
    o invoca!! Isto é muito comum. Reescrevemos (ou implementamos) um método e quem o invocará será um
    outro conjunto de classes (nesse caso, quem está chamando o compareTo é o Collections.sort, que o usa
    como base para o algoritmo de ordenação). Isso cria um sistema extremamente coeso e, ao mesmo tempo,
    com baixo acoplamento: a classe Collections nunca imaginou que ordenaria objetos do tipo ContaPoupanca,
    mas já que eles são Comparable, o seu método sort está satisfeito.
    (opcional) Se preferir, insira novas contas através de um laço (for). Adivinhe o nome da classe para colocar
    saldos aleatórios? Random. Do pacote java.util. Consulte sua documentação para usá-la.

  2. (opcional) Mude o critério de comparação da sua ContaPoupanca. Adicione um atributo nomeDoCliente
    na sua classe (caso ainda não exista algo semelhante) e tente mudar o compareTo para que uma lista de
    ContaPoupanca seja ordenada alfabeticamente pelo atributo nomeDoCliente.

Bom Pessoal acima eu listo os dois exercicios que não consegui desenvolver lendo a apostila da Caelum, que por sinal é fantastica(pra mim que sou iniciante), gostaria que se possivel alguem me ajudasse o primeiro é o uso do random não sei como usaria e o segundo teria que reescrever o campareTo pra ordenar alfabéticamente ñ consegui tbm parece-me ser facil mas não obtive exito nestes exercicios

desde ja grato!

16 Respostas

danielbussade

Poste aqui o que você conseguir fazer.

acidotherwise

Daniel, justo o random eu andei procurando na net e não consegui entender seu funcionamento ai gostaria de alguem me desse um exemplo deste metodo, e em relaçãoa a compareTo em ordem alfabetica ai nem sei como eu fiz ele em ordem de numero mas em alfabetica não sei como funcionaria se puderes me ajudar?

M

Um exemplo de Random:

// cria um gerador de números pseudo-aleatórios
Random gerador = new Random();
for (int i = 0; i < 100; i++) {
    // imprime um número aleatório entre zero e 29 (inclusive)
    System.out.println(gerador.nextInt(30));
}

Com base nesse exemplo, e lendo a documentação você já conseguirá usar a classe Random.

acidotherwise

isso mesmo bah agora fikou mais claro, obrigadão se puder me ajudar no campareTo te agradeço tbm

M

O método compareTo retorna um int. Esse int será:

  • Maior que zero, se o primeiro objeto vier antes (na ordenação) que o segundo.

  • Menor que zero, se o primeiro objeto vier depois do segundo.

  • Igual a zero se ambos os objetos tiverem a mesma posição (como se fosse uma espécie de fila).

Maneiras simples de verificar isso:

  • Com Strings
int valor = "Pedro".compareTo("Augusto");
System.out.println(valor);
  • Com Integer, Double e outras classes que estendem Number
int valor = new Double("4.55").compareTo(new Double("0.4824"));
System.out.println(valor);

E se invertêssemos os valores? O que aconteceria? E se tivéssemos o seguinte:

int valor = "GUJ".compareTo("GUJ");

O que a variável valor armazenaria?

acidotherwise

bom, marcos eu queria te agradescer mas a ideia que o compareTo faz eu entendi ate ja usei ele com inteiros a minha duvida realmente é como que eu reescreveria ele pra comparar Strings, como seria o metodo reescrito pra fazer tal comparação!
Desde ja grato

M

Você não vai reescrever nenhum método. Apenas vai usar o método compareTo que a classe String já tem. Leia a documentação da classe String e teste alguns exemplos.

int valor;
valor = "ABC".compareTo("BCD");
System.out.println(valor);
valor = "BCD".compareTo("ABC");
System.out.println(valor);
valor = "ABC".compareTo("ABC");
System.out.println(valor);
valor = "ABC".compareTo("abc");
System.out.println(valor);
sergiolopes

Olá acidotherwise!

O compareTo é mais fácil do que você está imaginando. A ideia é que todo objeto que precisar ser comparado com outro (é Comparável/Comparable) para se saber a ordem (quem vem antes e quem vem depois), todos esses objetos devem ter o método compareTo.

Boa parte das classes do java já tem o compareTo (String, Double, Integer etc). Se você quiser que suas classes também sejam comparáveis, aí voce faz a sua classe implementar Comparable e coloca o compareTo nela.

Mas se você quiser só usar uma classe de outra pessoa (String, por exemplo) e ela tiver o compareTo (String tem), basta chamar esse método já pronto nessa classe (você não precisa escreve-lo).

E no caso de ordenação, você pode usar Collections.sort que chama dentro dele o método compareTo dos argumentos passados (não é você que chama explicitamente).

Com isso, dá pra fazer a ordenação de uma lista de strings bem facilmente:

List<String> lista = new ArrayList<String>();
lista.add("tomate");
lista.add("alface");
lista.add("feijão");

Collections.sort(lista);

System.out.println(lista);

[]'s

acidotherwise

Sim compreendi, eu na verdade pensei que eu tivesse que reescreve-lo novamente e fazer a comparação em ordem alfabetica, mas me diga uma coisa sergio se eu quizer fazer isso tem como eu fazer, reescreve-lo para fazer a ordenação em ordem alfabetica, po exemplo imagino que ele ficaria igual ao metodo compareTo que tem dentro da classe String, teria como vc mostrar como fikaria o metodo?

sergiolopes

Voce quer escrever o compareTo igual o da classe String? Só olhar o código fonte do JDK:

http://www.docjar.com/html/api/java/lang/String.java.html
(linha 1174)

acidotherwise

exatamente oque eu queria sergio, mais por curiosidade mas era isso mais uma vez obrigado

emanuelcd

Sergio Lopes:
Olá acidotherwise!

O compareTo é mais fácil do que você está imaginando. A ideia é que todo objeto que precisar ser comparado com outro (é Comparável/Comparable) para se saber a ordem (quem vem antes e quem vem depois), todos esses objetos devem ter o método compareTo.

Boa parte das classes do java já tem o compareTo (String, Double, Integer etc). Se você quiser que suas classes também sejam comparáveis, aí voce faz a sua classe implementar Comparable e coloca o compareTo nela.

Mas se você quiser só usar uma classe de outra pessoa (String, por exemplo) e ela tiver o compareTo (String tem), basta chamar esse método já pronto nessa classe (você não precisa escreve-lo).

E no caso de ordenação, você pode usar Collections.sort que chama dentro dele o método compareTo dos argumentos passados (não é você que chama explicitamente).

Com isso, dá pra fazer a ordenação de uma lista de strings bem facilmente:

List<String> lista = new ArrayList<String>();
lista.add("tomate");
lista.add("alface");
lista.add("feijão");

Collections.sort(lista);

System.out.println(lista);

[]'s

Sergio, Estou emperrado com uma dúvida. se puder ajudar ficarei muito grato.

Tenho um relatório em JasperReports feito no iReport com um objeto Gráfico.

o gráfico em barras tem um Limite Máximo do valor de 100 e mínimo de 0.

o problema é que não aceita os valores que informe. min=0 e max=100

aparece o erro

“Cannot cast from int to Comparable”

como faço pra converte pra compatable.

já usei o compareTo() de várias formas mas não deu certo.

desde já agradeço sua ajuda.

sergiolopes

olha não sei dizer o porque disso…

mas pelo erro parece que voce esta tentando ordenar um punhado de ints e isso nao eh possivel.
veja se mudar o tipo para Integer nao resolve

[]s

emanuelcd

Sergio Lopes:
olha não sei dizer o porque disso…

mas pelo erro parece que voce esta tentando ordenar um punhado de ints e isso nao eh possivel.
veja se mudar o tipo para Integer nao resolve

[]s

Você é um especialista. Muito obrigado pela dica. Deu certo aqui.

Tenho interesse futuro em contratar seus serviços na área de consultoria em Java. meu msn: [email removido]

DavidUser

O problema é esse:
Um método pode chamar ele mesmo. Chamamos isso de recursão. Você pode resolver a série de fibonacci
usando um método que chama ele mesmo. O objetivo é você criar uma classe, que possa ser usada da
seguinte maneira:

Fibonacci fibo = new Fibonacci(); int i = fibo.calculaFibonacci(5); System.out.println(i);
Aqui imprimirá 8, já que este é o sexto número da série.
Este método calculaFibonacci não pode ter nenhum laço, só pode chamar ele mesmo como método. Pense
nele como uma função, que usa a própria função para calcular o resultado.

é de uma apostila da caelum.
o meu funciona perfeitamente mais acho q não é isso que queriam:

class FibonaciProgram{//1,1,2,3,5,8,13,21,... int i=2; public static void main(String[]args){ FibonaciProgram fibo=new FibonaciProgram(); fibo.calculaFibonacci(1,1,5); } void calculaFibonacci(int y,int x,int limite){ y=y+x; ++i; if (i==limite)System.out.println(y+x); x=y+x; ++i; if (i==limite)System.out.println(y+x); if(i<limite)calculaFibonacci(y,x,limite); } }

M

Amigo, acho que voce entendeu o exercicio errado, igual a mim, quando fui fazer esse exercicio eu tbm entendi o mesmo que vc, já estava rancando os pentelhos de raiva por não conseguir fazer igual pede lá, dai eu parei para avaliar o exercicio e entendi q ele quer q vc de um numero e ele retorne o proximo da sequencia, e não a sequencia inteira, ele quer q vc de o 5 e ele retorne 8, entao dei uma estudada na relaçao de numeros da fibonacci e descobri q o q ele quer é isso aqui…

public int fib(int x){
		if (x == 0 || x == 1) return 1;
		else { 
			int s1 = fib(x-1);
			int s2 = fib(x-2);
			return s1 + s2;
		}
	}

abraço

Criado 14 de abril de 2009
Ultima resposta 21 de ago. de 2009
Respostas 16
Participantes 7