[英]Implement a Java Iterator for a nested HashMap in which an element can be any of 1) an Integer or, 2) another nested HashMap or, 3) an empty HashMap
如標題所述,我們該怎么做? 我覺得這應該類似於遍歷樹,但是我不知道該怎么做。
Map<Integer, Object> map = new HashMap<>();
map.put(1, 1);
map.put(2, 2);
map.put(3, new HashMap<Integer, Object>());
Map<Integer, Object> m1 = (Map<Integer, Object>)map.get(3);
m1.put(4, 4);
m1.put(5, new HashMap<Integer, Object>());
m1.put(6, 6);
Map<Integer, Object> m2 = (Map<Integer, Object>)m1.get(5);
m2.put(8, 8);
m2.put(9, 9);
map.put(7, new HashMap<Integer, Object>());
在此示例中,前兩個“值”是兩個Integer,第三個“值”是嵌套的HashMap,其中包含兩個Integer和一個“更深層的”嵌套HashMap。 關於鍵7,我想表示“值”也可以是空的HashMap -因為這是一個采訪問題,所以我猜這種具有“空值”的可能性可能會影響next()或hasNext()實現?
實際上,有許多不同的解決方案。 到目前為止,最短的一種是使用Streams。
@SuppressWarnings("unchecked")
static <T> Stream<T> mapTraversalStream(Map<Integer, T> map) {
return map.values().stream().flatMap(value -> {
if(value instanceof Map) {
return mapTraversalStream((Map<Integer, T>)value);
} else {
return Stream.of(value);
}
});
}
static <T> Iterator<T> mapTraversalIterator(Map<Integer, T> map) {
return mapTraversalStream(map).iterator();
}
編輯:
如果您不能使用Java 8,則可以定義自己的map和flatten方法。
@SuppressWarnings("unchecked")
static <T> Iterator<T> mapTraversalIterator(Map<Integer, T> map) {
return flatten(map(map.values().iterator(), new Function<T, Iterator<T>>() {
public Iterator<T> apply(T value) {
if(value instanceof Map) {
return mapTraversalIterator((Map<Integer, T>)value);
} else {
return Collections.singleton(value).iterator();
}
}
}));
}
interface Function<A, B> {
B apply(A a);
}
static <A, B> Iterator<B> map(Iterator<A> iter, Function<A, B> op) {
return new Iterator<B>() {
public boolean hasNext() {
return iter.hasNext();
}
public B next() {
return op.apply(iter.next());
}
};
}
static <A> Iterator<A> flatten(Iterator<Iterator<A>> iter) {
return new Iterator<A>() {
private Iterator<A> next = null;
public boolean hasNext() {
while(iter.hasNext() && (next == null || !next.hasNext())) {
next = iter.next();
}
if(next == null || !next.hasNext()) return false;
else return true;
}
public A next() {
if(!hasNext()) throw new NoSuchElementException();
return next.next();
}
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.