Как добавить объект в другой набор объектов - PullRequest
4 голосов
/ 23 августа 2010

У меня есть два класса.Один (человек) для получателей и установщиков, а другой (люди) для вычисления данных.В моей ситуации я получаю данные из БД, используя 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 people.add(person);

В нем говорится

Метод add (People) в типе Setнеприменимо для аргументов (Персона)

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

Спасибо.

Ответы [ 6 ]

8 голосов
/ 23 августа 2010

Насколько я понимаю из вашего проекта, у вас есть отношение People-many 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;
2 голосов
/ 23 августа 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;
1 голос
/ 23 августа 2010

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

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

Во-вторых, 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();
1 голос
/ 23 августа 2010

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

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

0 голосов
/ 18 февраля 2018
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 голосов
/ 23 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...