문제점 : Java 객체간에 양방향 다 대일 관계를 유지하십시오. 구글/커먼즈 컬렉션 쌍방향지도와 같은Java에서 데이터베이스와 같은 간단한 컬렉션 클래스
는뭔가,하지만 난 이 중복 값 전방 측에 허용하려는, 그리고 세트 뒷면의 값으로 앞으로 키 있습니다. 이런 사용한 것을 : 간단한 자바 방법은
// maintaining disjoint areas on a gameboard. Location is a space on the
// gameboard; Regions refer to disjoint collections of Locations.
MagicalManyToOneMap<Location, Region> forward = // the game universe
Map<Region, <Set<Location>>> inverse = forward.getInverse(); // live, not a copy
Location parkplace = Game.chooseSomeLocation(...);
Region mine = forward.get(parkplace); // assume !null; should be O(log n)
Region other = Game.getSomeOtherRegion(...);
// moving a Location from one Region to another:
forward.put(parkplace, other);
// or equivalently:
inverse.get(other).add(parkplace); // should also be O(log n) or so
// expected consistency:
assert ! inverse.get(mine).contains(parkplace);
assert forward.get(parkplace) == other;
// and this should be fast, not iterate every possible location just to filter for mine:
for (Location l : mine) { /* do something clever */ }
1. 관계의 한 측면을 유지하기 위해 어느 필요할 때 Map<Location, Region>
또는 Map<Region, Set<Location>>
, 그리고 반복하여 역관계를 수집로서 또는 2. 양측지도를 유지하는 래퍼를 만들고 양측을 동기화 상태로 유지하기 위해 모든 변경 전화를 차단합니다.
1은 O (log n) 대신 O (n)이되어 문제가되고 있습니다. 나는 2시에 시작했고 곧 잡초에있었습니다. (Map 엔트리를 변경하는 방법이 얼마나 많이 있는지 알 수 있습니다.)
이것은 SQL 세계에서 거의 사소한 것입니다 (Location 테이블은 인덱싱 된 RegionID 열을 가져옵니다). 일반 오브젝트에 대해 사소한 것이 분명해졌습니다.
은 내가 당신이 실제로 무슨 일을하는지 알 수 없기 때문에 대답으로이를 넣어하기를 꺼려 해요,하지만 그 가치를 위해, 당신은 단지 잘못된 데이터 구조를 사용하고 생각합니다. 당신이 설명하는 것은지도 또는 집합이 아니며, 모든 정점이 다른 정점에 인접한 그래프입니다. 당신은 적절한 그래프 데이터 구조를 사용하여 더 나은 프로그래밍 모델 + 런타임을 얻게 될 것입니다. 아마도 – Juliet
일 것입니다. Maps and Sets의 모든 기능은 매우 기본적인 의미와 log-n 성능입니다. 더 나은 구조가 사물의 막연한 "보기"를 제공한다면, 완벽합니다. 지금 삭제 된 답변 덕택에 http://jung.sourceforge.net/을 (를) 탐색 중이며 유망 해 보입니다. – rgeorge
삽입 비용이 중요합니까? (또한, 그 마지막 줄에서 otherset 의미합니까?) – Stobor