Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с Hashtable


Автор: skalex 29.9.2004, 10:25
Мне необходимо создать структуру вида:
Код
{ husband = { name = John, age = 31 }, wife = { name = Mary, age = 29 } }


Пытаюсь реализовать данную задачу следующим образом:

Код
import java.util.Hashtable;

class MyHash {
   public static void main(String args[]) {
       Hashtable family = new Hashtable();
       family.put("husband", new Hashtable());
       family.get("husband").put("name", new String("John"));
       // etc
   }
}


Данный код не работает. Скажите пожалуйста, в чем моя ошибка? Или может быть в Java есть более удобный способ хранения подобных структур?

Автор: TrivialCore 29.9.2004, 10:56
Есть.
Код
public class NuclearFamily {

class Human {
private String name;
private int age;
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}

private Human husband;
private Human wife;
public NuclearFamily(/*...*/) {
//...
}

//...

}


Автор: skalex 29.9.2004, 11:27
Большое спасибо за информацию. Я мало знаком с Java и возможно мой вопрос окажется глупым...
Но нужно ли мне заранее будет знать количество объектов Human с которыми я буду работать в процессе работы приложения?
Код
private Human husband;
private Human wife;
и.т.д.

Автор: Gretchen 29.9.2004, 12:07
Я нисколько не оспариваю предидущее решение, хочу только сказать:

Mace, твой код не работал, потому что функция get возвращает объект типа Object. Для этого объекта нужно делать каст до Hashtable, т.е. писать так

((Hashtable)family.get("husband")).put("name", new String("John"));

Автор: TrivialCore 29.9.2004, 12:23
Цитата(Mace @ 29.9.2004, 11:27)
Но нужно ли мне заранее будет знать количество объектов Human с которыми я буду работать в процессе работы приложения?
Нет. Можно сделать, скажем, так:
Код
public class FamilyMember extends Human {

private String role;

public FamilyMember(String role, String name, int age) {
super(name, age);
this.role = role;
}
//...

Код
public class Family {
private ArrayList members; //ArrayList of FamilyMember

public Family(FamilyMember husband, FamilyMember wife) {
members = new ArrayList();
members.add(husband);
members.add(wife);
//...
}

public void addMember(FamilyMember member) {
members.add(member);
}
//.... и т.п., и т.д.

}


Автор: skalex 29.9.2004, 14:11
Gretchen , ты оказался прав. Теперь исходный вариант заработал.

Автор: skalex 29.9.2004, 16:53
В итоге я решил сделать так:

Файл FamilyMember.java:

Код
class FamilyMember {

  String name;
  int age;

  public FamilyMember(String name, int age) {
     this.name = name;
     this.age = age;
  }

  public String getName() {
     return name;
  }

  public int getAge() {
     return age;
  }

}


Файл Family.java:

Код
import java.util.Hashtable;

class Family {

  public static void main(String args[]) {
     Hashtable MyFamily = new Hashtable();
     MyFamily.put("husband", new FamilyMember("John", 31));
     System.out.println(((FamilyMember)MyFamily.get("husband")).getName());
  }

}


Насколько этот вариант рационален?

Автор: Domestic Cat 29.9.2004, 16:56
Цитата(Mace @ 29.9.2004, 07:53)
Насколько этот вариант рационален?


Зависит от того, как все это предполагается использовать.

Автор: Zandr 5.10.2004, 09:38
Брюс Эккель (Thinking in Java) рекомендует не использовать рудименты типа Vector, Stack, и Hashtable. Вместо Hashtable бери лучше HashMap.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)