Как да добавите обект към друг набор от обекти

Имам два класа. Един (Човек) за гетери и сетери и друг (Хора) за изчисляване на данните. Моята ситуация е, че получавам данните от DB с помощта на ResultSet, след което създадох обект на човек за съхраняване на данните от реда. След това създадох хора Обект за съхраняване на всички лица.

Всеки обект, създаден като 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;

Сега проблемът е последният ред в цикъла While people.add(person);

Казва

Методът add(People) в типа Set не е приложим за аргументите (Person)

Как мога да преодолея този проблем?

Благодаря.


person Community    schedule 23.08.2010    source източник


Отговори (6)


Моето разбиране от вашия дизайн е, че имате връзка Хората имат много хора, така че класът People съдържа колекция от Person обекти. Тогава бих очаквал нещо подобно:

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, ...
}

Така че в кода, свързан с вашата база данни, няма да е необходимо да създавате друг набор, защото People вече има този, от който се нуждаете:

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;
person Andreas Dolk    schedule 23.08.2010

Не разбирам защо бихте искали 2 класа на първо място. Можете да накарате Person да внедри и изчислителната част. Но въпреки това, какво можете да направите:

class People implements Set<Person> {

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

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

и тогава:

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;
person drstupid    schedule 23.08.2010
comment
Съгласен. Ако хората делегират HashMap вместо наследяват, ще бъде по-добре :) - person 卢声远 Shengyuan Lu; 23.08.2010
comment
Правилно. Все пак можеше да разсъждаваш :) - person drstupid; 23.08.2010

Разбирам, че Person е структура от данни (подобна на боб, с гетери и сетери), а People трябва да съдържа всички Person обекти от базата данни и да извършва изчисления върху тях.

Ако това е вярно, първо, не можете да декларирате хора в рамките на цикъла (защото ще бъде създаден нов People обект за всеки Person, а вие не искате това, доколкото разбирам).

Второ, People трябва да може да съдържа обекти Person. Така че трябва поне да се състои от Set от Person обекта. Можете да добавите повече функционалност, както желаете. Така че опитайте нещо подобно:

public class People {

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

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

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

}

И го използвайте така, както предложи предишният плакат:

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();
person double-m    schedule 23.08.2010
comment
Накарайте People да внедри интерфейса Set. След това можете да го използвате като набор и не е нужно да принуждавате потребителя да прави нещо като people.getPersons().add(person);. И ако предоставите getter за набора, не връщайте вътрешния набор, върнете Collections.unmodifiableSet(persons), така че никой да не може да промени вътрешните елементи. - person Andreas Dolk; 23.08.2010
comment
Благодаря за вашият отговор. Помогна ми. Но имам друг въпрос. Трябва ли да декларирам набор за Person Class. Като, Set‹Person› persons = нов HashSet‹Person›(); . - person ; 23.08.2010

Въз основа на това, което се опитвате да направите, според мен трябва да преобразувате вашия клас Person в People, преди да добавите към набора. Вашият клас People може да има конструктор, който приема Person като аргумент и копира задължителните полета от Person в People. Тук вашият код за добавяне към набора ще изглежда като people.add(new People(person));

Когато декларирате Set<People> people = new HashSet<People>();, това означава, че този набор трябва да съдържа обекти от „тип“ People, т.е. екземпляри на People или екземпляри на подкласове на People. Ако People е интерфейс, тогава наборът може да съдържа всеки обект, който имплементира интерфейса.

person Gopi    schedule 23.08.2010

Не мисля, че Set<People> people = new HashSet<people>(); трябва да се пише в цикъла.

person 卢声远 Shengyuan Lu    schedule 23.08.2010
comment
Големият проблем е с реда people.add(person);. Декларацията е само печатна грешка - person drstupid; 23.08.2010
comment
Да, току-що го споменах там... Всъщност не е декларирано там. - person ; 23.08.2010

person    schedule
comment
Моля, обмислете добавянето на някакво обяснение. - person Sunil; 18.02.2018