Cómo agregar un objeto a otro conjunto de objetos

Tengo dos clases Una (Persona) para captadores y establecedores, y otra (Personas) para calcular los datos. Cuál es mi situación es que obtengo los datos de la base de datos usando ResultSet, luego creé un Objeto persona para almacenar los datos de la fila. Luego creé objetos de personas para almacenar a todas las personas.

Cada objeto creado como SET.

while(rs.next())
{
    Set<People> people = new HashSet<people>();
    Person person = new Person();
    String name = rs.getString(2);
    person.setName(name);
    int id = rs.getInt(1);
    person.setId(id);
    String dept = rs.getString(4);
    person.setDept(dept);
    int age = rs.getInt(3);
    person.setAge(age);
    people.add(person);
}
return people;

Ahora el problema es la última línea en el bucle While people.add(person);

Dice

El método add (People) en el tipo Set no es aplicable para los argumentos (Person)

¿Cómo puedo superar este problema?

Gracias.

Respuesta 1

Según entiendo su diseño, usted tiene una relación Personas tiene muchas Personas , por lo que la Peopleclase contiene una colección de Personobjetos. Entonces esperaría algo como esto:

public class Person {
  private String name;
  private Date dateOfBirth;
  // .. more attributes

  // getters and setters

  // overrides of equals, hashcode and toString
}

public class People implements Set<Person> {
  private Set<Person> persons = new HashSet<Person>();

  public boolean add(Person person) {
    return persons.add(person);
  }

  // more methods for remove, contains, ...
}

Entonces, en el código relacionado con su base de datos, no necesitaría crear otro conjunto, porque Peopleya tiene el que necesita:

People people = new People();  // or get it, if it's already created
while(rs.next())
{
    Person person = new Person();
    String name = rs.getString(2);
    person.setName(name);
    int id = rs.getInt(1);
    person.setId(id);
    String dept = rs.getString(4);
    person.setDept(dept);
    int age = rs.getInt(3);
    person.setAge(age);
    people.add(person);
}
return people;
Respuesta: 2

No entiendo por qué querrías 2 clases en primer lugar. También puede hacer que Person implemente la parte computacional. Pero, sin embargo, lo que podrías hacer:

class People implements Set<Person> {

private HashSet<Person> hashset = new HashSet<Person>();

// ... your computational code goes here
// delegate all Set methods to hashset
}

y entonces:

People people = new People();
while(rs.next())
{
    Person person = new Person();
    String name = rs.getString(2);
    person.setName(name);
    int id = rs.getInt(1);
    person.setId(id);
    String dept = rs.getString(4);
    person.setDept(dept);
    int age = rs.getInt(3);
    person.setAge(age);
    people.add(person);
}
return people;
Respuesta: 3

Según lo que está tratando de hacer, creo que debe convertir su clase de Persona a Gente antes de agregarla al conjunto. Su clase People puede tener un constructor que toma una Persona como argumento y copia los campos requeridos de Persona a Gente. Aquí su código para agregar al conjunto se verá asípeople.add(new People(person));

Cuando declaras Set<People> people = new HashSet<People>(); lo que significa es que se supone que este conjunto contiene objetos de "tipo" People, es decir, instancias de People o instancias de subclases de People. Si People es una interfaz, el conjunto puede contener cualquier objeto que implemente la interfaz.

Respuesta: 4

Entiendo que Persones una estructura de datos (similar a un bean, con captadores y establecedores), y Peopledebe contener todos los Personobjetos de la base de datos y realizar cálculos sobre ellos.

Si eso es cierto, en primer lugar, no puede declarar personas dentro del ciclo (porque se Peoplecreará un nuevo objeto para cada uno Person, y no lo quiere, por lo que entiendo).

En segundo lugar, Peopledebe poder contener objetos Persona. Por lo tanto, al menos debería estar compuesto por una Setde Personobjetos. Puede agregar más funcionalidad a su gusto. Entonces, intente algo como esto:

public class People {

    Set<Person> persons = new HashSet<Person>();

    Set<Person> getPersons() {
        return persons;
    }

    int computeSomethingAboutPeople() { 
        // return as you please
    }

}

Y úselo así, como lo sugirió el póster anterior:

People people = new People();
while(rs.next())
{
    Person person = new Person();
    String name = rs.getString(2);
    person.setName(name);
    int id = rs.getInt(1);
    person.setId(id);
    String dept = rs.getString(4);
    person.setDept(dept);
    int age = rs.getInt(3);
    person.setAge(age);
    people.getPersons().add(person);
}
int answer = people.computeSomethingAboutPeople();
Respuesta: 5

No creo que Set<People> people = new HashSet<people>();deba escribirse en el bucle.

Respuesta: 6

Quiero desmarcar mediante programación la fila (o filas) actualmente seleccionada en una JTable. Básicamente quiero lo opuesto a esto: JTable table = ...; table.setRowSelectionInterval (x, x); Lo intenté (con ...

Estoy usando JSQLPARSER por primera vez. Tengo algunos archivos SQL que vienen dinámicamente, necesito leer los nombres de tablas y columnas de ese SQL. Después de mucho googlear probé con JSQLPARSER. Estoy intentando ...

Estoy escribiendo en la ventana del navegador usando servletResponse.getWriter (). Write (String). Pero, ¿cómo borro el texto que fue escrito previamente por alguna otra llamada de escritura similar?

Posible duplicado: configuración del tamaño de almacenamiento dinámico de JVM en tiempo de ejecución ¿Es posible evitar que un programa se bloquee cuando encuentra un OutOfMemoryError aumentando la memoria permitida para el programa? Lata ...