Skip to content

Instantly share code, notes, and snippets.

@will-molloy
Last active July 27, 2019 08:24
Show Gist options
  • Save will-molloy/4085b0606c4754262dc2412a105c5a04 to your computer and use it in GitHub Desktop.
Save will-molloy/4085b0606c4754262dc2412a105c5a04 to your computer and use it in GitHub Desktop.
Zipping two Lists into a Map (resulting map has O(n) get, mainly used for iterating pairs)
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class ZippedListMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {
private final List<K> keys;
private final List<V> values;
public ZippedListMap(List<K> keys, List<V> values) {
Objects.requireNonNull(keys, "keys");
Objects.requireNonNull(values, "values");
if (keys.size() != values.size()) {
throw new IllegalArgumentException("Expected lists of equal size");
}
this.keys = keys;
this.values = values;
}
@Override
public Set<Entry<K, V>> entrySet() {
return new AbstractSet<>() {
@Override
public Iterator<Entry<K, V>> iterator() {
Iterator<K> keysIterator = keys.iterator();
Iterator<V> valuesIterator = values.iterator();
return new Iterator<>() {
@Override
public boolean hasNext() {
return keysIterator.hasNext();
}
@Override
public Entry<K, V> next() {
return new SimpleImmutableEntry<>(keysIterator.next(), valuesIterator.next());
}
};
}
@Override
public int size() {
return keys.size();
}
};
}
public static void main(String... args) {
var list1 = List.of(1, 2, 3);
var list2 = List.of(1, 2, 3);
var map = new ZippedListMap<>(list1, list2);
// key = 1 value = 1
// key = 2 value = 2
// key = 3 value = 3
map.forEach((k, v) -> System.out.println("key = " + k + " value = " + v));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment