Статистика HashSet

Интересно, есть ли лучший способ получить агрегированную статистику объектов в HashSet. Есть ли хороший подход, а не повторение всего Set?

import java.lang.Thread.State;
import java.util.HashSet;
import java.util.Set;

public class Stats {

    static class Item {

        private State state;

        public State getState() {
            return state;
        }

        public void setState(State state) {
            this.state = state;
        }

        public Item(State state){
            this.state = state;
        }
    }

    public static void main(String[] args) {

        Set<Item> items = new HashSet<Stats.Item>();
        items.add(new Item(State.NEW));
        items.add(new Item(State.BLOCKED));
        items.add(new Item(State.BLOCKED));

        /*
         * printout here
         */
            // New=1
            // Blocked=2
    }
}

person llundin    schedule 15.07.2014    source источник
comment
Нет, если только вы не настроите реализацию Hashset (что будет почти равно тому, что вы делаете сейчас).   -  person kosa    schedule 15.07.2014


Ответы (3)


Нет, но вы можете написать свою собственную реализацию интерфейса Set и в методе add проверить состояние элемента и увеличить счетчики. Затем вы можете восстановить статистику.

person Kasper Ziemianek    schedule 15.07.2014
comment
Это может быть вариант. У вас есть идея, как обрабатывать изменения состояний объекта? - person llundin; 15.07.2014
comment
Каждый элемент должен содержать ссылки на все наборы, к которым он принадлежит. После изменения состояния, например, вызова установщика, счетчики должны быть обновлены. - person Kasper Ziemianek; 15.07.2014
comment
Хорошо, я рассмотрю это, если итерация окажется слишком дорогостоящей, когда количество элементов и состояний увеличится. - person llundin; 15.07.2014
comment
vogella.com/tutorials/DesignPatternObserver/article.html может быть идеей - person Kasper Ziemianek; 15.07.2014

Нет, это не так. Однако с самодельной реализацией или оболочкой вы можете вычислить статистику при вставке в хеш-набор.

person Matthias Kricke    schedule 15.07.2014

Если мне не изменяет память, выполнение чего-то подобного с реализацией Set представлено в качестве примера в книге Блоха «Эффективная Java». Выбран именно потому, что если вы хотите статистику по коллекции, вы должны накачать свою собственную.

Поиск здесь показывает ссылку, о которой я думаю, где он обсуждает композицию по сравнению с наследованием: Каким образом класс-оболочка соответствует композиции, описанной Джошуа Блохом?

Я признаю, что это не совсем ответ на вопрос, но я думаю, что это добавляет к разговору и показывает пример того, как (и почему) создавать свои собственные инструментированные классы для ваших собственных целей.

person Community    schedule 15.07.2014
comment
Не могли бы вы опубликовать образец этого для своего ответа? - person Jimmy Smith; 15.07.2014
comment
Увы, у меня только мёртвое издание, и его сейчас нет со мной. Я постараюсь получить реальную ссылку. Это было у меня на уме, потому что я только вчера прочитал это. - person ; 15.07.2014