Java: многоиндексированный отсортированный кэш или SortedMap с индексным доступом - PullRequest
2 голосов
/ 10 ноября 2010

Итак, вот проблема, с которой я сталкиваюсь, я пытаюсь реализовать HashMap, используя Id в качестве ключа и указатель объекта в качестве значения.

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

Однако я хотел бы иметь возможность отсортировать сумму инвестиций в определенной категории и получить доступ к N-му элементу при доступе к ключу и объекту. Таким образом, он должен быть проиндексирован по каждой сумме инвестиций.

Пример:
Id = 1, объект: {Gas = 2000, Tech = 5000, Bank = 1000}
Id = 2, объект: {Gas = 1000, Tech = 8000, Bank = 2000}
Id = 3, объект: {Gas = 4000, Tech = 6000, Bank = 3000}

Итак, я хочу иметь возможность выполнять поиск по идентификаторам объекта (легко). Но я также хочу иметь возможность сделать что-то вроде Gas [0], чтобы получить максимальные инвестиции в газ (т.е. Id = 3), Tech [2], чтобы получить 3-е место по величине инвестиций в технологию (т.е. Id = 1). *

Какую структуру данных следует использовать для чего-то подобного?

1 Ответ

2 голосов
/ 10 ноября 2010

Вы можете использовать java.util.SortedSe t с пользовательским Компаратором для каждого необходимого дополнительного индекса.

Map<Integer, MyClass> byId = new HashMap<Integer, MyClass>();
SortedSet<MyClass> byGas = new TreeSet<MyClass>(new MyGasComparator());
SortedSet<MyClass> byTech = new TreeSet<MyClass>(new MyTechComparator()); 
...

class MyGasComparator implements Comparator<MyClass> {
    @override
    public int compare(MyClass a, MyClass b) {
        int r = a.getGas() - b.getGas();
        if (r != 0) {
            return r;
        }

        // gas is equal, ensure fixed order
        return a.getId() - b.getId();
    }
}

...

С компаратором, показанным выше, byGas().first() будет объектом с наибольшим значением газа, и оба значения byGas.iterator() и byGas.toArray() будут возвращать объекты, упорядоченные Gas в порядке убывания.Просто поменяйте местами a и b в компараторе, чтобы изменить порядок.

Также рассмотрите возможность инкапсуляции карт индекса в другом классе, который отвечает за добавление, удаление и поиск значений для различных типов индекса.

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