Linked List de objetos

Continuando a discussão do Linked List:

Nesse código, você criou uma lista ligada de strings. Lendo a pergunta do cara isso parece atender, mas cheguei aqui buscando a resposta para a pergunta inicial dele: criar uma lista ligada de objetos (Pessoa).

Imaginando que Pessoa tem vários outros atributos além do nome, como fazer a inserção na lista?
Poderia criar uma instância de cada pessoa:

/* O código abaixo parte do pressuposto que a classe Pessoa 
tem três atributos e métodos get e set para cada um deles
*/

List lista = new LinkedList<Pessoa>(); //cria ela
Pessoa pessoaUm = new Pessoa;
pessoaUm.setNome("Junior");
pessoaUm.setIdade(27);
pessoaUm.setSexo("M");

Pessoa pessoaDois = new Pessoa;
pessoaDois.setNome("Maria");
pessoaDois.setIdade(23);
pessoaDois.setSexo("F");

Pessoa pessoaTres = new Pessoa;
pessoaTres.setNome("Joao");
pessoaTres.setIdade(28);
pessoaTres.setSexo("M");

list.add(pessoaUm); //adiciona uma pessoa
list.add(pessoaDois);
list.add(pessoaTres);

Iterator i = lista.iterator(); //cria um objeto Iterator da sua LinkedList
while (i.hasNext()) { //percorrer toda a lista até o ultimo elemento
  // Aqui também não sei como ficaria 
  // Só tenho como certo que não seria da forma abaixo
  System.out.println(i.next); //Mostra o valor da Lista
}

Mas será que não tem um jeito menos esquisito? E se eu estou recebendo os dados das pessoas de uma fonte externa? Não saberia previamente quantas pessoas vão ser inseridas para eu declarar as instâncias.

Não tem como eu usar diretamente os métodos set da classe na hora de fazer o add?

Desculpem se estou falando besteira. Estou começando :slight_smile:

Desculpem. Achei que o texto que selecionei para citação apareceria aqui.
O que eu chamei de “nesse código” foi uma resposta dada na discussão anterior que continha o seguinte trecho de código:

No java 5:

// List<String> suaLista = new ArrayList<String>(); se fosse um arraylist
List<String> suaLista = new LinkedList<String>();
suaLista.add("Junior");
suaLista.add("Maria");
suaLista.add("Joao");
//O for each se baseia no iterator automaticamente
for (String nome : suaLista) {
   System.out.println(nome);
}
String nome = suaLista.get(0);

Não entendi nada :smiley:

Sei que vc tentou postar num tópico de 2007 (10 anos atrás) e acabou criando outro tópico.
Mas não entendi se vc quis ajudar, ou está com alguma dúvida.

Estou com dúvida :slight_smile:

Quero fazer uma lista ligada de objetos e cheguei a esse tópico.

Preciso dizer que já avancei um pouco na questão (não sei se para o lado certo) Mas ainda não consigo compilar meu código :non-potable_water:

Vou quebrar a cabeça mais um pouquinho e já coloco aqui como ficou

[quote="ViniciusPacheco, post:1, topic:346747"]
/* O código abaixo parte do pressuposto que a classe Pessoa 
tem três atributos e métodos get e set para cada um deles
*/

List lista = new LinkedList(); //cria ela
Pessoa pessoaUm = new Pessoa;
pessoaUm.setNome("Junior");
pessoaUm.setIdade(27);
pessoaUm.setSexo("M");

Pessoa pessoaDois = new Pessoa;
pessoaDois.setNome("Maria");
pessoaDois.setIdade(23);
pessoaDois.setSexo("F");

Pessoa pessoaTres = new Pessoa;
pessoaTres.setNome("Joao");
pessoaTres.setIdade(28);
pessoaTres.setSexo("M");

list.add(pessoaUm); //adiciona uma pessoa
list.add(pessoaDois);
list.add(pessoaTres);

Iterator i = lista.iterator(); //cria um objeto Iterator da sua LinkedList
while (i.hasNext()) { //percorrer toda a lista até o ultimo elemento
  // Aqui também não sei como ficaria 
  // Só tenho como certo que não seria da forma abaixo
  System.out.println(i.next); //Mostra o valor da Lista
}
[/quote]

Nesse codigo acima, vc ja tem uma lista, itere sobre ela com um laço “for”

for (Pessoa p : lista) {
}

Obrigado pela atenção, Igor.

Sim, eu sei que tenho a lista, mas achei a solução muito esquisita.

Fiz diferente, mas ainda não sei se estou no caminho certo.
Primeiro a classe Person:

public class Person implements Comparable<Person> {

    private String name;
    private int age;
    private String sex;

    public Person(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    /**
     * This class is used to maintein the informations about people.
     *
     * @param pName
     */
    public void setName(String pName) {
        /**
         * This method is used to inform the name of one person
         */
        name = pName;
    }

    public String getName() {
        /**
         * This method is used to get the name of one person
         */
        return this.name;
    }

    public void setAge(int pAge) {
        /**
         * This method is used to inform the age of one person
         */
        age = pAge;
    }

    public int getAge() {
        /**
         * This method is used to get the age of one person
         */
        return this.age;
    }

    public void setSex(String pSex) {
        /**
         * This method is used to inform the age of one person
         */
        sex = pSex;
    }

    public String getSex() {
        /**
         * This method is used to get the age of one person
         */
        return this.sex;
    }

    public int compare(Person person, Person anotherPerson) {
        return person.getName().compareTo(anotherPerson.getName());
    }

    @Override
    public int compareTo(Person o) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

Agora a classe FilaDoPao:

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class FilaDoPao {

    public static void main(String[] args) {
        List<Person> fila = new LinkedList<Person>();
        
        fila.add(new Person("Junior", 27, "M"));
        fila.add(new Person("Maria", 23, "F"));
        fila.add(new Person("Joao", 28, "M"));
        fila.add(new Person("Vinicius", 46, "M"));

        System.out.println("Ordenando a lista:");
        Collections.sort(fila);

        for (Person p : fila) {
            System.out.println(p.getName() + ", " + p.getAge() + " anos, " + p.getSex() + ".");
        }
    }
}

Compilar elas compilam. Mas não roda. Falta conseguir fazer o método compareTo da classe Person. Achei que o compare que tem lá ia ser suficiente, mas não foi.

É o ponto onde estou quebrando a cabeça agora. Achei essa solução mais aceitável que a primeira, mas não tenho certeza se é o mais legal a se fazer.

Consegui ordenar pela idade ajustanto o método compareTO:

@Override
public int compareTo(Person anotherPerson) {
    if (this.age < anotherPerson.age) {
        return -1;
    }
    if (this.age > anotherPerson.age) {
        return 1;
    }
    return 0;
}

Ordenando a lista:

Maria, 23 anos, F.
Junior, 27 anos, M.
Joao, 28 anos, M.
Vinicius, 46 anos, M.

C:\Temp\JavaTutorial>

Vou tentar pelo nome agora.

Person.java:68: error: bad operand types for binary operator '<'
if (this.name < anotherPerson.name) {
^
first type: String
second type: String
Person.java:71: error: bad operand types for binary operator '>'
if (this.name > anotherPerson.name) {
^
first type: String
second type: String
2 errors

Não entendo: o próprio compilador está dizendo que os dois tipos são String…

buguei agora…

Resolvido.
String é objeto.
Tem o método compareTo para fazer a comparação, seu animal de rabo…