Это псевдокод, чтобы выполнить то, что вы хотите. На абстрактном уровне у вас есть список Pair<K,V> (first, second)
, отсортированный по K
, и никакие две пары действительно не равны (то есть вы можете иметь (k1,v1)
и (k1,v2)
, но вы не можете иметь два (k1,v1)
в списке.
Вы хотите объединить последовательные пары (k,v1),(k,v2),(k,v3)
в одну группу (k,[v1,v2,v3])
.
List<Pair<K,V>> in;
List<Pair<K,List<V>>> out = [ ];
Pair<K,V> lastP = SENTINEL_PAIR; // lastP.first matches nothing
Pair<K,List<V>> lastGroup;
for (Pair<K,V> p : in) {
if (p.first == lastP.first) { // same group as last
lastGroup.second.add(p.second);
} else { // start a new group
lastGroup = (p.first, [ p.second ]);
out.add(lastGroup);
}
lastP = p;
}
В вашем случае K
- это идентификатор, а V
- это регион. Это O(N)
.