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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к объекту в хэш-таблице по его имени 
:(
    Опции темы
x8m6
Дата 11.6.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проблема такая:
Есть 2 иерархии!
1-ая (Интерфейс IObject и классы, его реализующие _Object1, _Object2,..., и.т.д.)
2-ая (На вершине абстрактный класс _Class и его наследники _Class1 , _Class2,..., и.т.д. )

Каждый объект, порожденный от класса _Class или его наследников содержит в себе некоторое количество представителей класса, 
реализовавшего интерфейс IObject. Хранятся они в хэш - таблице.

Т.е. так:

Код

abstract class _Class {

Hashtable<String,IObject> objects = new Hashtable<String,IObject>();


public IObject getObject(String name){
  objects.getValue(name);

}

public void addObject(String name,IObject object){
  objects.put(name,object);
}


}


Для каждого объекта типа IObject при его создании генерируется уникальное имя. По этому имени он и заносится в хэш-таблицу.
Проблема возникает, когда нужно достать объект типа IObject по его уникальному имени из хэш таблицы. На этот момент нет доступа к самому объекту, а значит и нет доступа к его имени, поэтому и не получается это сделать.
Как решить проблему? Возможно по другому нужно спроектировать...
PM MAIL   Вверх
LSD
Дата 11.6.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(x8m6 @  11.6.2009,  11:25 Найти цитируемый пост)
Проблема возникает, когда нужно достать объект типа IObject по его уникальному имени из хэш таблицы. На этот момент нет доступа к самому объекту, а значит и нет доступа к его имени, поэтому и не получается это сделать.
Как решить проблему? Возможно по другому нужно спроектировать... 

Достать по имени означает, что имя известно. А в твоей формулировке получается, что есть некий критерий по которому ты хочешь найти объект, но проблема в том, что ты этот критерий не можешь нормально сформулировать. И начать следует именно с того, по какому критерию ты хочешь искать объекты, класс объекта, значения неких полей и т.д.



Чой-то сегодня с утра народ так и поперло, одна задачка хлеще другой smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x8m6
Дата 11.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Достать по имени означает, что имя известно. А в твоей формулировке получается, что есть некий критерий по которому ты хочешь найти объект, но проблема в том, что ты этот критерий не можешь нормально сформулировать. И начать следует именно с того, по какому критерию ты хочешь искать объекты, класс объекта, значения неких полей и т.д

Критерий должен быть таков, чтобы он однозначно и уникально определял объект.  По этому и бы решено использовать уникальное имя в качестве критерия. Но в такой формулировке действительно не получается достучатся до этого объекта.

По этому поводу есть ещё одна мысль...

При добавлении объекта в хэш таблицу запоминать его имя в каком - нибудь динамическом перечислении внутри этого самого объекта типа _Class. Тогда было бы замечательно... можно было бы просмотреть имена которые там есть и по нужному имени получить объект из хэша. Но такой структуры "динамическое перечисление" по моему не существует... 
PM MAIL   Вверх
Fieral
Дата 11.6.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну какбы сам объект и есть его уникальное имя
чисто так, из теории информации

а если вы хотите дать ему новое имя - то это имя должно существовать относительно чего-то
например есть некто вася пупкин
относительно своих друзей - он "вася"
относительно одноклассников - "пупкин"
относительно паспотрного стола - "Петрович Василий Пупкин 1986 года рождения от 4 февраля, номер паспорта N65-28376491 выдан....."

так что нужен тогда некий объект относительно которого существует имя


Это сообщение отредактировал(а) Fieral - 11.6.2009, 12:08
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 11.6.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(x8m6 @  11.6.2009,  11:50 Найти цитируемый пост)
При добавлении объекта в хэш таблицу запоминать его имя в каком - нибудь динамическом перечислении внутри этого самого объекта типа _Class. Тогда было бы замечательно... можно было бы просмотреть имена которые там есть и по нужному имени получить объект из хэша. Но такой структуры "динамическое перечисление" по моему не существует...  

1. У HashMap можно получить Set ключей.
2. Сразу же возникает вопрос: а на кой болт вообще нужен HashMap, если мы получаем объект путем тупого перебора всех объектов? Можно просто сложить их в массив, а затем бегать по нему и искать объект с "нужным" именем.

Ты по прежнему не понимаешь. У тебя нет четкого критерия по которому ты хочешь искать объект. Как ты собираешься среди всех имен найти то которое тебе нужно?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Fieral
Дата 11.6.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и что значит "нет доступа к самому объекту"?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
x8m6
Дата 11.6.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

ну какбы сам объект и есть его уникальное имя
чисто так, из теории информации

а если вы хотите дать ему новое имя - то это имя должно существовать относительно чего-то
например есть некто вася пупкин
относительно своих друзей - он "вася"
относительно одноклассников - "пупкин"
относительно паспотрного стола - "Петрович Василий Пупкин 1986 года рождения от 4 февраля, номер паспорта N65-28376491 выдан....."

так что нужен тогда некий объект относительно которого существует имя


И как это всё можно приминить к моей задаче... Вообще то у самого объекта нет имени... имя есть у ссылки на объект... а ссылок может быть очень много

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


Бывалый
*


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

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



Цитата

1. У HashMap можно получить Set ключей.
2. Сразу же возникает вопрос: а на кой болт вообще нужен HashMap, если мы получаем объект путем тупого перебора всех объектов? Можно просто сложить их в массив, а затем бегать по нему и искать объект с "нужным" именем.


Да, это будет тупо перебор. 

Может быть как то так попробывать:

Код

public class MyHash {

    private ArrayList<String> keys = new ArrayList<String>();
    private ArrayList<IObject> objects = new ArrayList<IObject>();
    
    
    public void add(String name,IObject object){
        if (!keys.contains(name)){
            keys.add(name);            
            objects.add(object);
        }
    }
    
    public IObject get(String name){
        if (!keys.contains(name)){
            int index = keys.indexOf(name);
            return objects.get(index);
        }
        return null;
    }
    
    public Enum getNamesToEnumeration(){
        Enum names = null;
        // здесь каким то образом получить из keys -> перечисление 
               // В качестве keys можно использовать не ArrayList а какую - нибудь другую коллекцию 
               // из которой можно извлечь элементы и поместить их в перечисление
        
        return names;
    }
    
    
}


И тогда поправить _Class :

Код

abstract class _Class {

private MyHash objects = new MyHash();
public Enum NAMES = null;


public IObject getObject(NAMES name){
  String n = name.name();
  return objects.get(n);
}
public void addObject(String name,IObject object){
  objects.add(name,object);
  NAMES = objects.getNamesToEnumeration();
}
}


Тогда не будет тупого перебора. 

Цитата

 Как ты собираешься среди всех имен найти то которое тебе нужно?


По имени объекта, которое было придумано при его добавлении в MyHash. При этом тот програмист, который добавил некоторый объект, должен помнить имя этого объекта ... если он его забыл он может его вспомнить, подсмотрев его в перечислении... и таким образом получить нужный объект... 

Пример:

Код

// создаем некотрый объект из 2-ой иерархии:

_Class man = new _Class1();

// создаем неcколько объектов из 1-ой иерархии:

IObject flat = new _Object1();
IObject car = new _Object2();
IObject money = new _Object3();

// теперь добавляем их к мэну

man.addObject("Квартира", flat);
man.addObject("Машина", car);
man.addObject("Деньги", money);

// Теперь смотрим что есть у мэна и получаем соответствующий объект
// Допустим хотим получить его квартиру

IObject oman =  man.getObject(man.NAMES.Квартира);



Слишком заморочено... сам понимаю...но по другому не представляю как сделать...


Это сообщение отредактировал(а) x8m6 - 11.6.2009, 14:34
PM MAIL   Вверх
MisterCleric
Дата 11.6.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А может перенести всю эту лабуду в реляционную базу, вот и будет там тебе уникальное имя объекта - его ИД. А то что Вася для друзей "Вася", а для одноклассников - "пупкин", так это просто в определенном месте твоего функционала просто будешь показывать ту или иную колонку из этой таблицы.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Fieral
Дата 11.6.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а ясно, я под это дело написал свой Map с блекджеком и шлюхами на базе своего Set в котором можно дёргать ключи по порядковому номеру 

Это сообщение отредактировал(а) Fieral - 11.6.2009, 14:04
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 11.6.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(x8m6 @  11.6.2009,  13:25 Найти цитируемый пост)
По имени объекта, которое было придумано при его добавлении в MyHash. При этом тот програмист, который добавил некоторый объект, должен помнить имя этого объекта ... если он его забыл он может его вспомнить, подсмотрев его в перечислении... и таким образом получить нужный объект... 

Программист будет это делать вручную? smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
x8m6
Дата 11.6.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

А может перенести всю эту лабуду в реляционную базу, вот и будет там тебе уникальное имя объекта - его ИД. А то что Вася для друзей "Вася", а для одноклассников - "пупкин", так это просто в определенном месте твоего функционала просто будешь показывать ту или иную колонку из этой таблицы.

Нет, в базу не пойдет. Слишком часто нужно обращатся к этим объектам, добавлять и удалять новые.

Код

Программист будет это делать вручную? 

Да  smile 

Это сообщение отредактировал(а) x8m6 - 11.6.2009, 14:39
PM MAIL   Вверх
Fieral
Дата 11.6.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://robotics.icstweb.org/rebecca-e/file...09/06/remap.jar ?

Добавлено @ 15:20
Код

MapArray<String, Object> A = new MapArray<String, Object>();
        Object o = new Object();
        A.put("123", o);

        String key = A.getKey(0);
        Object o2 = A.get(key);
        System.out.println(o == o2);
        System.out.println(key);
        A.print();


Цитата

true
123
[0] 123 :-> java.lang.Object@c17164 


Это сообщение отредактировал(а) Fieral - 11.6.2009, 15:21
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 11.6.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(x8m6 @  11.6.2009,  14:36 Найти цитируемый пост)
Да

Жесть smile 

Тогда нафига вам вообще Java? Выписывайте имена на бумажку, на бумажку же выписывайте данные, потом просто все аккуратно разложите по папочкам и все будет ОК smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Fieral
Дата 11.6.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Тогда нафига вам вообще Java? 


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

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

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


 




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


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

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