• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

lesiano

Dúvidas

15 mensagens neste tópico

i) Alguém me podia dar um exemplo de um construtor que iniciasse uma variável e evocasse o construtor da super classe ao mesmo tempo?

ii) Dava para me fazerem o método toString de uma subclasse de outra com a variável nome, por favor?

Para já é só. Thx.  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O construtor é fácil basta meteres super("arg1",arg2) e assim chamas o construtor da superclasse e depois do super inicializas as variáveis que quiseres da classe actual.

O método toString é só retornar uma string nada mais, mas na percebi bem o que queres neste caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:shocking:

No way. Com esse construtor não estás a iniciar uma variável privada da sub classe.

Isto é.

public Class Um {

...

}

public Class Dois extends Um {

private int iii;

}

Quero o construtor da dois, sff.

O toString quero que mo faças, se não for incómodo, q retorna uma String já eu sei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

public Dois() {
super();
iii = 0;
}

public String toString() {
return super.toString() + "\n" + this.iii;
}

Isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu creio q seja isso. Agr há um problema.

O Super tem q vir SEMPRE primeiro. Fazes ideia pq?

Qt ao segundo eu estava a pensar cagar a lei de:

+super.getVar1()+ ...

Mas se o q meteste aí funciona é muito melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, o super vem sempre primeiro. Se não colocares a referência ao construtor da superclasse (que pode ser um qualquer que tenhas lá definido), então o Java coloca implicitamente como primeira instrução do construtor da subclasse, a instrução super(), garantindo a invocação do construtor por omissão da superclasse.

Mesmo quando tens um this(...) no teu construtor para invocar outro construtor que tenhas definido na classe em questão, o Java vai verificar se o tal outro construtor contém a instrução super(...). Se no fim de percorrer todos os this(...), ou seja, quando chegar ao último construtor que tenhas invocado, e não encontrar o super(...), então coloca-o lá implicitamente (como já expliquei acima). Quanto o this(...) é usado, o super(...) deve vir primeiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Querendo eu um HashSet com ints e strings, qual é o tipo do elemento do HashSet? Object?

Como ordeno, por ordem crescente de key (String), uma treeMap?

Thx.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que não usas 2 HashSets?

A classe String já implementa a interface Comparable (e por conseguinte, já tem o método compareTo). O que tens de fazer é criar uma classe que implemente a interface Comparator para as Strings, para depois usares uma instância dessa classe no construtor da TreeMap:

import java.util.*;

public class StringComparator implements Comparator<String> {
        public int compare(String s1, String s2) {
                return s1.compareTo(s2);
        }
}

import java.util.*;

public class Main {
        public static void main(String[] args) {
                TreeMap<String,Integer> map = new TreeMap<String,Integer>(new StringComparator());
                map.put("joao",62);
                map.put("andre",21);
                map.put("pedro",12);
                for (String s : map.keySet())
                        System.out.println(s);
        }
}

Output:

andre
joao
pedro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

****-se, as merdas q tu sabes assim de cor. Jazus, sinto-me um burro, às vezes.

Levaste um applaud.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes-me dar um exemplo em que não possa usar o compareTo sff?

Ou só a classe string tem isso já definido?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se tiveres uma classe definida por ti, por omissão, não terá o método compareTo pois não implementaste a interface Comparable.

Ex: Se tiveres uma classe Pessoa que tem um nome (String) e idade (int) como variáveis de instância:

import java.util.*;

public class Pessoa {
        private String nome;
        private int idade;

        public Pessoa() { this.nome = ""; this.idade  = 0; }
        public Pessoa(String n, int i) { this.nome=n; this.idade=i; }

        public String getNome() { return this.nome; }
        public int getIdade() { return this.idade; }

        public String toString() {
                StringBuilder s = new StringBuilder();
                s.append("Pessoa \nNome: ");
                s.append(this.nome);
                s.append("\nIdade: ");
                s.append(this.idade);
                s.append("\n");
                return s.toString();
        }
}

Podes criar 2 Comparators: um que vai permitir ordenar por nome e outro por idade:

import java.util.*;

public class PessoaNomeComparator implements Comparator<Pessoa> {
        public int compare(Pessoa p1, Pessoa p2) {
                return p1.getNome().compareTo(p2.getNome());
        }
}

import java.util.*;

public class PessoaIdadeComparator implements Comparator<Pessoa> {
        public int compare(Pessoa p1, Pessoa p2) {
                if (p1.getIdade() > p2.getIdade())
                        return 1;
                else
                        if (p1.getIdade() < p2.getIdade())
                                return -1;
                        else return 0;
        }
}

Depois quando quiseres usar, fazes assim:

import java.util.*;

public class Main {
        public static void main(String[] args) {
                TreeMap<Pessoa,String> map = new TreeMap<Pessoa,String>(new PessoaNomeComparator());
                map.put(new Pessoa("joao",12),"cenas");
                map.put(new Pessoa("andre",21),"mais cenas");
                for (Pessoa p : map.keySet())
                        System.out.println(p);

                TreeMap<Pessoa,String> m = new TreeMap<Pessoa,String>(new PessoaIdadeComparator());
                m.put(new Pessoa("joao",12),"cenas");
                m.put(new Pessoa("andre",21),"mais cenas");
                for (Pessoa p : m.keySet())
                        System.out.println(p);
        }
}

E obténs como resultado:

Pessoa 
Nome: andre
Idade: 21

Pessoa 
Nome: joao
Idade: 12

Pessoa 
Nome: joao
Idade: 12

Pessoa 
Nome: andre
Idade: 21

Os 2 primeiros estão ordenados por nome e os 2 últimos por idade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

import java.util.*;

public class PessoaIdadeComparator implements Comparator<Pessoa> {

        public int compare(Pessoa p1, Pessoa p2) {

                if (p1.getIdade() > p2.getIdade())

                        return 1;

                else

                        if (p1.getIdade() < p2.getIdade())

                                return -1;

                        else return 0;

        }

}

Este bocado de cógido n podia ser substituido por:

public class PessoaIdadeComparator implements Comparator<Pessoa> {
        public int compare(Pessoa p1, Pessoa p2) {
               return p1.getIdade() - p2.getIdade();
        }
}

Ou retornar 1 e -1 é obrigatorio no Comparator?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é obrigatório mas é boa prática:

One last note: You might be tempted to replace the final return statement in the Comparator with the simpler:

    return e1.number() - e2.number();

Don't do it unless you're absolutely sure no one will ever have a negative employee number! This trick does not work in general because the signed integer type is not big enough to represent the difference of two arbitrary signed integers. If i is a large positive integer and j is a large negative integer, i - j will overflow and will return a negative integer. The resulting comparator violates one of the four technical restrictions we keep talking about (transitivity) and produces horrible, subtle bugs. This is not a purely theoretical concern; people get burned by it.

http://java.sun.com/docs/books/tutorial/collections/interfaces/order.html

Já agora, eu ali atrás andei a fazer coisas que não eram precisas. Qualquer classe que implemente a interface Comparable pode ser usada nos TreeMaps, TreeSets, etc sem necessidade de um Comparator, porque a ordem natural já é mantida pela Comparable - a menos que queiramos explicitar uma outra ordem! (sabia que havia algum truque, mas não me estava a lembrar...):

Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort). Objects that implement this interface can be used as keys in a sorted map or elements in a sorted set, without the need to specify a comparator.

Por isso bastava declarar algo do género:

import java.util.*;

public class Main {
        public static void main(String[] args) {
                TreeMap<String,Integer> map = new TreeMap<String,Integer>();
                map.put("pedro",12);
                map.put("andre",21);
                for (String s : map.keySet())
                        System.out.println(s + "\t" + map.get(s));
        }
}

E o resultado seria:

andre	21
pedro	12

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ordem natural é sempre a comparação dos keys?

Méne, tb é boa prática teres só um return na cena, pelo que, se deveria meter ali uma flag. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora