Хороший класс Java для использования для сбора математических векторов - PullRequest
2 голосов
/ 09 февраля 2011

Я реализую график (как в Vertices, Edges, не декартовой). Я моделирую график как физическую коллекцию узлов (класс, который я создал).

Я хочу иметь набор Сил как Векторы (в смысле математики), чтобы представлять силы, действующие на каждый узел, и в идеале я хотел бы иметь возможность выполнить поиск с Узлом в качестве ключа, который звучит для меня как какая-то таблица поиска хешей.

Какую коллекцию лучше использовать, или мне придется делать свою собственную?

Если что-то требует уточнения, просто спросите.

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Если я правильно понял ваши потребности, вы, в основном, хотите сделать отображение Node-> Vector один-ко-многим.

Если ваш узел правильно реализует hashCode () и equals (), вы можетеиспользуйте Multimap от Google Guava.Это обеспечивает отображение Map<Node,Collection<Vector>> автоматически.

Преимущество использования Multimap заключается в том, что вам не нужно делать это:

Collection<Vector> vectors = nodeToVectorMapping.get(node);
if (vectors == null) {
    vectors = new HashSet<Vector>();
    nodeToVectorMapping.put(node, vectors);
}
vectors.add(vector);

, вместо этого вам нужно только сделать это:

nodeToVectorMapping.put(node,vector);

Multimap заботится о проверке, существует ли внутренняя Коллекция или нет.Если вы попадете в многопоточную среду, подход «сделай это вручную» будет включать синхронизацию, чтобы гарантировать, что два потока не создали коллекцию одновременно, и так далее.Гуава от Google очень помогает во всем этом, и многое другое.

Будучи большим поклонником Google Collections (оригинального дома Multimap, до того, как он был поглощен большим проектом Guava), я также должен указатьвы в направлении MapMaker , в котором есть все виды удивительных качеств, которые вы, возможно, найдете полезными - ограничения по размеру, уровни параллелизма, ленивая инициализация значений на основе ключей и тому подобное.Я использовал их в параллельном приложении, и они много раз спасали мою жизнь!:)

1 голос
/ 09 февраля 2011

Вы можете просто добавить вектор в качестве поля в своем классе Node.

public class Node {
    private ForceVector force = ForceVector.getZeroForceVector();

    public ForceVector getForceVector() {
        return force;
    }
    public void addForceVector(ForceVector forceToAdd) {
        force = force.add(forceToAdd);
    }
}

Я представляю ForceVector как некоторый (неизменный) класс, который вы написали для описания вектора силы.

0 голосов
/ 09 февраля 2011

Если у вас есть несколько сил, действующих на каждый узел, вам необходимо сопоставить узел с набором из четырех, например, с помощью HashMap<Node, Set<Vector>>.Просто не забудьте правильно реализовать equals и hashCode для своих узлов.

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

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