Last active
July 27, 2019 08:24
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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