член коллекции? - PullRequest
       1

член коллекции?

0 голосов
/ 03 марта 2011

У меня есть два класса, Foo и Bar. У каждого Foo есть имя и куча предметов. Бар содержит кучу Foo's, каждый с уникальным именем.

Bar имеет метод AddEntry, который принимает fooName и элемент (1), если foo с fooName уже находится в панели, добавляет другой элемент в Foo или (2), если foo с fooName отсутствует в панели , создает Foo с этим именем и добавляет элемент в новый Foo.

Это схема того, как я реализую. Есть ли способ лучше? Я просто изучаю Java, но это кажется неуклюжим

class Foo { // a name and some items
    String fooName;
    List<Object> items = new ArrayList<Object>;
    Foo(name) {...} // create a named Foo
    AddtoFoo(item) {...} // add an item to this Foo
}

class Bar { // a bunch of foo's
    List<Foo> fooList = new Arraylist<Foo>;

    void AddEntry(String fooName, Object item) {
        boolean member = false;
        for(Foo foo : fooList){
            if{foo.name == fooName) {
                member = true;
                foo.AddtoFoo(item); // adds an item to this foo
                break;
             }
        }
        if(member == false) {
            Foo foo = new Foo(fooName); // creates a named foo
            foo.AddtoFoo(item);  // adds the item
            fooList.add(foo);  // maintain our list of foo's
        }

    }
}

Ответы [ 8 ]

2 голосов
/ 03 марта 2011

Если имя foo предназначено только для поиска, возможно, Map<String,List<Foo>> (и удаление Foo.name) избавит вас от необходимости кодирования.

2 голосов
/ 03 марта 2011

В классе bar вы должны использовать HashMap вместо ArrayList с FooName в качестве ключа и Foo в качестве пары.Так как HashMap имеет o (1) время поиска, которое вы выполняете с помощью цикла for для itreation в arraylist.

2 голосов
/ 03 марта 2011

Возможно, вы вместо этого захотите использовать Map, чтобы вы могли искать объект по ключу.

Map<String,Foo> fooMap = new HashMap<String,Foo>();
foo.put("name_of_foo",new Foo());

Тогда ваш addEntry может выглядеть следующим образом:

void addEntry(String fooName, Object item){
    Foo foo = fooMap.get(fooName);
    if(foo == null){
       foo = new Foo();
       fooMap.put(fooName,foo);
    }
    foo.addToFoo(item);
}

Кроме того, вы должны сравнить String равенство, используя foo.name.equals(fooName)

2 голосов
/ 03 марта 2011

Я бы использовал Map<String, Foo> для сопоставления имени foo с объектом foo.

Map<String, Foo> fooMap = new HashMap<String, Foo>();

Таким образом, вы могли бы сделать

Foo foo = fooMap.get(fooName);
if( foo == null)
{
  foo = new Foo(fooName);
  fooMap.put(fooName, foo);
}
foo.AddtoFoo(item); 
1 голос
/ 03 марта 2011

Если foo не должен оставаться в том же порядке, вы можете заменить свой список foo на Map<String, Foo>. Поиск существующего foo станет операцией O (1), а не операцией O (n).

Даже если foos должны оставаться в порядке, вы можете использовать LinkedHashMap.

1 голос
/ 03 марта 2011

Вы можете попробовать использовать HashMap в Bar вместо списка. Используйте fooName как уникальный ключ. Таким образом, в Bar вы можете проверить, что экземпляр Foo уже известен в вашем текущем баре намного быстрее (просто что-то вроде этого):

Map<String, Foo> fooMap = new HashMap<String, Foo>();

... 
Foo foo = fooMap.get(fooName);
if(foo == null)
{
   fooMap.add(fooName, new Foo(fooName));
}
0 голосов
/ 03 марта 2011

Лучший способ и более удобный способ - использовать hashCode и использовать содержит.

public int hashCode () {return fooName.hashCode ();}

Это должно быть быстрее, чем для: loop.Хотя он и не обеспечивает сложности O (1), но гарантирует (теоретически) фиксированный поиск ~ O (1)

Также метод get () делает то же самое с hashMap.Он использует hashCode для получения объекта с карты.

0 голосов
/ 03 марта 2011

Это правильно, но если вы ищете правильный объект foo, вместо List, используйте Map, например HashMap. Используйте в качестве ключа fooName и в качестве значения объект Foo. Получите объект, который вы ищете с get(fooName), и если возвращает ноль, не существует, и добавьте новый Foo с put().

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