2010-08-23 1 views
3

У меня есть два класса. Один (Лицо) для геттеров и сеттеров, а другой (Люди) для вычисления данных. Какова моя ситуация, я получаю данные из БД с помощью ResultSet, а затем создал человека Object для хранения данных строки. Затем я создал людей Object для хранения всех людей.Как добавить объект в другой набор объектов

Каждый объект, созданный как 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 Loop people.add(person);

Это говорит

метод добавления (люди) в типе набора не применяется для аргументов (Person)

Как я могу решить эту проблему?

Спасибо.

ответ

8

Моего understandig от вашего дизайна является то, что у вас имеется людей имеют много-Person отношения, поэтому 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; 
1

Основываясь на том, что вы пытаетесь сделать, я чувствую, вы должны преобразовать свой класс Person to People перед добавлением в набор. Класс «Ваш человек» может иметь конструктор, который принимает Личность в качестве аргумента и копирует необходимые поля из «Человек в людей». Вот код для добавления в наборе будет выглядеть people.add(new People(person));

Когда вы объявляете Set<People> people = new HashSet<People>(); что это означает, что этот набор должен содержать объекты «типа» Людей т.е. случаи людей или экземпляров подклассов людей. Если People является интерфейсом, то набор может содержать любой объект, реализующий интерфейс.

2

Я дон Понимаете, почему вам нужно 2 класса в первую очередь. У вас есть человек, который также реализует вычислительную часть. Но, тем не менее, что вы могли бы сделать:

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; 
+0

Согласен. Если люди делегируют HashMap вместо наследования, будет лучше :) –

+0

Исправить. Вы могли бы рассуждать, хотя :) – drstupid

0

Я не думаю, что Set<People> people = new HashSet<people>(); должны быть записаны в цикле.

+1

Большая проблема связана с линией «people.add (человек);». Объявление - это просто опечатка – drstupid

+0

Я, я только что упомянул об этом там ... Его фактически не объявили. – 2010-08-23 07:01:47

1

Я понимаю Person это структура данных (боб-как, с добытчиками и сеттеров), и People должен содержать все Person объекты из базы данных и выполнения расчетов по ним.

Если это правда, вы не можете объявить людей в цикле (потому что для каждого будет создан новый объект People, и вы не хотите, чтобы я понял).

Во-вторых, People должен уметь содержать объекты Личности. Поэтому он должен состоять хотя бы из 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(); 
+1

Имейте 'People', реализуя интерфейс' Set'. Затем вы можете использовать его как Set и не принуждать пользователя делать что-то вроде 'people.getPersons(). Add (person);'. И если вы предоставляете getter для набора, не возвращайте внутренний набор, возвращайте 'Collections.unmodifiableSet (person)', поэтому никто не может изменять внутренности. –

+0

Спасибо за ваш ответ. Это помогло мне. Но у меня есть другой вопрос. Должен ли я объявлять набор для класса Person. Нравится, Set people = new HashSet (); , – 2010-08-23 10:41:29

0
class Cartesian 
{ 
    double x,y,z; 
    public 
    Cartesian() 
    { 
     x=y=z=0; 
    } 
    Cartesian (int i,int j,int k) 
    { 
     x=i; 
     y=j; 
     z=k; 
    } 

    Cartesian add_coordinates(Cartesian c) 
    { 
     c.x=x+c.x; 
     c.y=y+c.y; 
     c.z=z+c.z;  
     return c;     
    } 

    void display() 
    { 
     System.out.println("Addition of coordinates is : "+x+"i "+y+"j "+z+"k "); 
    } 

} 

class Coordinate 
{ 
    public static void main(String[] args) 
    { 
     Cartesian obj1 = new Cartesian(5,5,-10); 
     Cartesian obj2 = new Cartesian(5,5,-10); 
     Cartesian obj3 = new Cartesian(); 
     obj3=obj1.add_coordinates(obj2); 
     obj3.display(); 
    } 
} 
+0

Пожалуйста, обратите внимание на добавление некоторых объяснений. – Sunil