annotate src/main/java/cl/maps/duplex/DuplexMap.java @ 111:71465cead59c

patch "ALIAS" attribute of ALIAS type in XML export.
author Robert Casties <casties@mpiwg-berlin.mpg.de>
date Mon, 12 Aug 2019 18:05:16 +0200
parents 615d27dce9b3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
jurzua
parents:
diff changeset
1 package cl.maps.duplex;
jurzua
parents:
diff changeset
2
jurzua
parents:
diff changeset
3 import java.util.ArrayList;
jurzua
parents:
diff changeset
4 import java.util.Collection;
jurzua
parents:
diff changeset
5 import java.util.Collections;
jurzua
parents:
diff changeset
6 import java.util.HashMap;
jurzua
parents:
diff changeset
7 import java.util.LinkedList;
jurzua
parents:
diff changeset
8 import java.util.List;
jurzua
parents:
diff changeset
9 import java.util.Map;
jurzua
parents:
diff changeset
10 import java.util.Set;
jurzua
parents:
diff changeset
11
jurzua
parents:
diff changeset
12 import org.mpi.openmind.repository.bo.Entity;
jurzua
parents:
diff changeset
13
jurzua
parents:
diff changeset
14 import cl.maps.utils.DuplexMapKeepSortByNormalizedOV;
jurzua
parents:
diff changeset
15 import cl.maps.utils.DuplexMapSortByNormalizedOV;
jurzua
parents:
diff changeset
16
jurzua
parents:
diff changeset
17 public class DuplexMap<V, A, B> implements IDuplexMap<V, A, B>{
jurzua
parents:
diff changeset
18
jurzua
parents:
diff changeset
19 private Map<DuplexKey<A, B>, V> map;
jurzua
parents:
diff changeset
20 private Map<A, List<DuplexKey<A, B>>> mapAKey;
jurzua
parents:
diff changeset
21 private Map<B, DuplexKey<A, B>> mapOwnKey;
jurzua
parents:
diff changeset
22
jurzua
parents:
diff changeset
23 public DuplexMap(){
jurzua
parents:
diff changeset
24 this.map = new HashMap<DuplexKey<A, B>, V>();
jurzua
parents:
diff changeset
25 this.mapAKey = new HashMap<A, List<DuplexKey<A, B>>>();
jurzua
parents:
diff changeset
26 this.mapOwnKey = new HashMap<B, DuplexKey<A, B>>();
jurzua
parents:
diff changeset
27 }
jurzua
parents:
diff changeset
28
jurzua
parents:
diff changeset
29 public DuplexMap(DuplexMap<? extends V, A, B> m) {
jurzua
parents:
diff changeset
30 this.map = new HashMap<DuplexKey<A, B>, V>();
jurzua
parents:
diff changeset
31 this.mapAKey = new HashMap<A, List<DuplexKey<A, B>>>();
jurzua
parents:
diff changeset
32 this.mapOwnKey = new HashMap<B, DuplexKey<A, B>>();
jurzua
parents:
diff changeset
33 this.putAllForCreate(m);
jurzua
parents:
diff changeset
34 }
jurzua
parents:
diff changeset
35
jurzua
parents:
diff changeset
36 private void putAllForCreate(DuplexMap<? extends V, A, B> m) {
jurzua
parents:
diff changeset
37 for(Map.Entry<DuplexKey<A, B>, ? extends V> e : m.entrySet()){
jurzua
parents:
diff changeset
38 DuplexKey<A, B> tKey = e.getKey();
jurzua
parents:
diff changeset
39 this.map.put(tKey, e.getValue());
jurzua
parents:
diff changeset
40 this.mapOwnKey.put(tKey.getOwnKey(), tKey);
jurzua
parents:
diff changeset
41
jurzua
parents:
diff changeset
42 if(!mapAKey.containsKey(tKey.getAKey())){
jurzua
parents:
diff changeset
43 mapAKey.put(tKey.getAKey(), new LinkedList<DuplexKey<A, B>>());
jurzua
parents:
diff changeset
44 }
jurzua
parents:
diff changeset
45 if(!mapAKey.get(tKey.getAKey()).contains(tKey)){
jurzua
parents:
diff changeset
46 mapAKey.get(tKey.getAKey()).add(tKey);
jurzua
parents:
diff changeset
47 }
jurzua
parents:
diff changeset
48 }
jurzua
parents:
diff changeset
49 }
jurzua
parents:
diff changeset
50
jurzua
parents:
diff changeset
51 public List<V>getValuesByAKey(A srcKey){
jurzua
parents:
diff changeset
52 List<V> list = new ArrayList<V>();
jurzua
parents:
diff changeset
53 if(mapAKey.containsKey(srcKey)){
jurzua
parents:
diff changeset
54 for(DuplexKey<A, B> tKey : mapAKey.get(srcKey)){
jurzua
parents:
diff changeset
55 list.add(map.get(tKey));
jurzua
parents:
diff changeset
56 }
jurzua
parents:
diff changeset
57 }
jurzua
parents:
diff changeset
58 return list;
jurzua
parents:
diff changeset
59 }
jurzua
parents:
diff changeset
60
jurzua
parents:
diff changeset
61 public V getValuesByOwnKey(B ownKey){
jurzua
parents:
diff changeset
62 DuplexKey<A, B> tKey = mapOwnKey.get(ownKey);
jurzua
parents:
diff changeset
63 if(tKey != null){
jurzua
parents:
diff changeset
64 return this.map.get(tKey);
jurzua
parents:
diff changeset
65 }
jurzua
parents:
diff changeset
66 return null;
jurzua
parents:
diff changeset
67 }
jurzua
parents:
diff changeset
68
jurzua
parents:
diff changeset
69 public Set<DuplexKey<A, B>> keySet(){
jurzua
parents:
diff changeset
70 return this.map.keySet();
jurzua
parents:
diff changeset
71 }
jurzua
parents:
diff changeset
72
jurzua
parents:
diff changeset
73 public Set<Map.Entry<DuplexKey<A, B>, V>> entrySet() {
jurzua
parents:
diff changeset
74 return this.map.entrySet();
jurzua
parents:
diff changeset
75 }
jurzua
parents:
diff changeset
76
jurzua
parents:
diff changeset
77 @Override
jurzua
parents:
diff changeset
78 public int size() {
jurzua
parents:
diff changeset
79 return this.map.size();
jurzua
parents:
diff changeset
80 }
jurzua
parents:
diff changeset
81
jurzua
parents:
diff changeset
82 @Override
jurzua
parents:
diff changeset
83 public boolean isEmpty() {
jurzua
parents:
diff changeset
84 return this.map.isEmpty();
jurzua
parents:
diff changeset
85 }
jurzua
parents:
diff changeset
86
jurzua
parents:
diff changeset
87 @Override
jurzua
parents:
diff changeset
88 public boolean containsKey(DuplexKey<A, B> key) {
jurzua
parents:
diff changeset
89 return this.map.containsKey(key);
jurzua
parents:
diff changeset
90 }
jurzua
parents:
diff changeset
91
jurzua
parents:
diff changeset
92 @Override
jurzua
parents:
diff changeset
93 public boolean containsValue(Object value) {
jurzua
parents:
diff changeset
94 return this.map.containsValue(value);
jurzua
parents:
diff changeset
95 }
jurzua
parents:
diff changeset
96
jurzua
parents:
diff changeset
97 @Override
jurzua
parents:
diff changeset
98 public V get(DuplexKey<A, B> key) {
jurzua
parents:
diff changeset
99 return map.get(key);
jurzua
parents:
diff changeset
100 }
jurzua
parents:
diff changeset
101
jurzua
parents:
diff changeset
102 @Override
jurzua
parents:
diff changeset
103 public V put(DuplexKey<A, B> tKey, V value) {
jurzua
parents:
diff changeset
104
jurzua
parents:
diff changeset
105 if(!mapAKey.containsKey(tKey.getAKey())){
jurzua
parents:
diff changeset
106 List<DuplexKey<A, B>> list = new LinkedList<DuplexKey<A, B>>();
jurzua
parents:
diff changeset
107 Collections.sort(list, new DuplexMapSortByNormalizedOV<V, A, B>(this));
jurzua
parents:
diff changeset
108 mapAKey.put(tKey.getAKey(), list);
jurzua
parents:
diff changeset
109 }
jurzua
parents:
diff changeset
110
jurzua
parents:
diff changeset
111 List<DuplexKey<A, B>> list = mapAKey.get(tKey.getAKey());
jurzua
parents:
diff changeset
112 if(value instanceof Entity){
jurzua
parents:
diff changeset
113 //sorted insertion
jurzua
parents:
diff changeset
114 if(!list.contains(tKey)){
jurzua
parents:
diff changeset
115 int index = Collections.binarySearch(list, tKey, new DuplexMapKeepSortByNormalizedOV<V, A, B>(this, value));
jurzua
parents:
diff changeset
116 if (index < 0) index = ~index;
jurzua
parents:
diff changeset
117 list.add(index, tKey);
jurzua
parents:
diff changeset
118 }
jurzua
parents:
diff changeset
119 }else{
jurzua
parents:
diff changeset
120 //unsorted insertion
jurzua
parents:
diff changeset
121 if(!list.contains(tKey)){
jurzua
parents:
diff changeset
122 list.add(tKey);
jurzua
parents:
diff changeset
123 }
jurzua
parents:
diff changeset
124 }
jurzua
parents:
diff changeset
125
jurzua
parents:
diff changeset
126 this.mapOwnKey.put(tKey.getOwnKey(), tKey);
jurzua
parents:
diff changeset
127 return this.map.put(tKey, value);
jurzua
parents:
diff changeset
128
jurzua
parents:
diff changeset
129 //****
jurzua
parents:
diff changeset
130 /*
jurzua
parents:
diff changeset
131
jurzua
parents:
diff changeset
132
jurzua
parents:
diff changeset
133
jurzua
parents:
diff changeset
134 if(!mapAKey.containsKey(tKey.getAKey())){
jurzua
parents:
diff changeset
135 List<DuplexKey<A, B>> list = new ArrayList<DuplexKey<A, B>>();
jurzua
parents:
diff changeset
136 mapAKey.put(tKey.getAKey(), list);
jurzua
parents:
diff changeset
137 }
jurzua
parents:
diff changeset
138 if(!mapAKey.get(tKey.getAKey()).contains(tKey)){
jurzua
parents:
diff changeset
139 mapAKey.get(tKey.getAKey()).add(tKey);
jurzua
parents:
diff changeset
140 }
jurzua
parents:
diff changeset
141
jurzua
parents:
diff changeset
142 this.mapOwnKey.put(tKey.getOwnKey(), tKey);
jurzua
parents:
diff changeset
143 return this.map.put(tKey, value);
jurzua
parents:
diff changeset
144 */
jurzua
parents:
diff changeset
145 }
jurzua
parents:
diff changeset
146
jurzua
parents:
diff changeset
147 @Override
jurzua
parents:
diff changeset
148 public V remove(DuplexKey<A, B> key) {
jurzua
parents:
diff changeset
149 if(mapAKey.containsKey(key.getAKey())){
jurzua
parents:
diff changeset
150 mapAKey.get(key.getAKey()).remove(key);
jurzua
parents:
diff changeset
151 }
jurzua
parents:
diff changeset
152 this.mapOwnKey.remove(key.getOwnKey());
jurzua
parents:
diff changeset
153 return this.map.remove(key);
jurzua
parents:
diff changeset
154 }
jurzua
parents:
diff changeset
155
jurzua
parents:
diff changeset
156 @Override
jurzua
parents:
diff changeset
157 public void clear() {
jurzua
parents:
diff changeset
158 this.map.clear();
jurzua
parents:
diff changeset
159 this.mapAKey.clear();
jurzua
parents:
diff changeset
160 this.mapOwnKey.clear();
jurzua
parents:
diff changeset
161 }
jurzua
parents:
diff changeset
162
jurzua
parents:
diff changeset
163 @Override
jurzua
parents:
diff changeset
164 public Collection<V> values() {
jurzua
parents:
diff changeset
165 return this.map.values();
jurzua
parents:
diff changeset
166 }
jurzua
parents:
diff changeset
167
jurzua
parents:
diff changeset
168
jurzua
parents:
diff changeset
169 }