Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс с колекцией, отследить что элемент колекции, изменился и удалить его 
:(
    Опции темы
ChessMaster
  Дата 12.8.2007, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Уже который день думаю над решением такой проблемы:

Есть мартышки, которые живут в зоопарке. Рядом с зоопарком стоит больница для мартышек, чтобы их лечить. У каждой мартышке моет внезаптно поднятся температура. Хозяен зоопарка смотрит на температуру и если она превышает определённое значение нормативов зоопарка, то хозяен зоопарка объявляет черезвычайную ситуацию и выгоняет мартышку из зоопарка и отдаёт её хозяену больницы. 

Код


public class Zoo{
private List <Monkey> monkeys = new ArrayList<Monkeys>();

}



Код

public class Monkey{

}



Как можно в классе ZOO отследить изменение объектов его коллекции?

Это сообщение отредактировал(а) ChessMaster - 12.8.2007, 12:19
PM MAIL   Вверх
Real McCoy
Дата 12.8.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



В смысле, отследить, что у объектов Monkey что-то "внутри" поменялось?

Если да, то добавить в метод класса Monkey, который изменяет интересующие св-ва, например, вызов firePropertyChange(). А класс Zoo должен унаследовать PropertyChangeListener. При создании каждой обезьянки, и перед её помещением в массив, вешать ей в качестве слушателя объект Zoo. В обработчике PropertyChangeEvent'а можно получить как обезьянку целиком, так и свойство, на изменение которого генерилось событие.

Код

public class Zoo implements PropertyChangeListener
{
  public Zoo()
  {
    monkeys = new ArrayList<Monkey>();

    for (int i = 0; i < 5; i++)
    {
      Monkey mnk = new Monkey("Monkey #" + monkeys.size());
      mnk.addPropertyChangeListener(this);
      monkeys.add(mnk);
    }
  }

  // ...

  public void propertyChange(PropertyChangeEvent evt)
  {
    Monkey mnk = (Monkey)evt.getSource();
    System.out.println("Zoo: " + mnk.getName() + " has a temperature = " + mnk.getTemperature() + ";"); 
  }

  private ArrayList<Monkey> monkeys;
}


Код

public class Monkey extends JComponent
{
  public Monkey(String name)
  {
    this.name = name;
  }
  
  public void setTemperature(float temperature)
  {
    float oldTemperature = this.temperature;
    this.temperature = temperature;

    firePropertyChange("TemperatureChange", oldTemperature, temperature);
  }
  
  public String getName()
  {
    return this.name;
  }
  
  public float getTemperature()
  {
    return this.temperature;
  }

  private float temperature = 36.6f;
  private String name;
}


Это первое, что приходит в голову. И по-моему, самое простое решение.
PM MAIL   Вверх
dorogoyIV
Дата 12.8.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Код

List monkeys=new ArrayList();
int orangutang=5;
monkeys.add(orangutang);
... // что то происходит, и вдруг orangutang изменился
if(orangutang != 5)
{
 for(int i=0;i<monkeys.size();i++)
 {
  if(Integer(monkeys.get(i))==orangutang)
   monkeys.remove(i);
 }
}

вроде так  smile 
PM MAIL   Вверх
Maksym
Дата 13.8.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



ChessMaster
Хозяин зоопарка, в данном случае, -- Observer.

Это сообщение отредактировал(а) Maksym - 13.8.2007, 10:12
PM MAIL   Вверх
ChessMaster
Дата 13.8.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Я решил сделать через Observer-observable, но что не получается зоопарк не отправляетмартышку в госпиталь, что же делать?


Код

import java.util.*;

public class Zoo implements Observer{
    
    private List<Monkey> monkeys = new ArrayList<Monkey>();
    
    public void addMonkey(Monkey monkey){
        this.monkeys.add(monkey);        
    }
    
    public void killMonkey(Monkey monkey){
        this.monkeys.remove(monkey);
    }
    
    public void update(Observable os ,Object ob ) {
         Monkey monkey = (Monkey) ob;
         float temp = monkey.getTemperature();
         if (temp > 37){
             this.monkeys.remove(monkey);
             System.out.println("Monkey was send to hospital");
         }
    }
  
    
}



import java.util.*;


public class Monkey extends Observable {
    
    private float temperature;
    
    Monkey(){        
        this.temperature = 36.6f;        
    }
    private List<Zoo> observersList = new ArrayList<Zoo>(); 
    
    public void register(Zoo zoo){
        observersList.add(zoo);
    }
    
    public void unregister(Zoo zoo){
        observersList.remove(zoo);
        System.out.println("Monkey was unregistred from zoo");
    }
    
    public void upTemperature(){
        this.temperature++;
    }
    
    public float getTemperature(){
        return this.temperature;
    }

}



public class MAIN {

    
    public static void main(String args[]){
        
        System.out.println("Hello zoo!");
        
        Monkey monkey = new Monkey();
        Zoo zoo = new Zoo();
        
        monkey.addObserver(zoo);
        zoo.addMonkey(monkey);
        
        monkey.upTemperature();
        monkey.upTemperature();
    }
}



PM MAIL   Вверх
fixxer
Дата 13.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Я либо окосел совсем, либо метод public void update(Observable os ,Object ob ) нигде не вызывается


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.