我同意Multimap
是不是你想要達到的最好的數據結構; Lists
的Map
可能在這裏效果更好。 MultiMap
根據它們的自然排序值(除非提供自定義比較器)。如果我理解正確,那麼您需要的是按插入時間排序(忽略@Louis Wasserman指出的期望輸出中的ggg
錯誤)。如果不將地圖的值類型從String
更改爲自定義類,我無法想象如何實現這一點。下面的代碼片段說明了這一點。
TreeMultimap
呈現值NavigableSet
的,不alllow隨機存取權限(再次,如何選擇其他容器參數) - 因此需要使用最後一個值緩存交織輸出。
public class GuavaMultiMapTest {
private ComparableMapValue DUMMY = new ComparableMapValue(-1, null);
private TreeMultimap<String, ComparableMapValue> mm;
private int insertionCounter;
private class ComparableMapValue implements Comparable<ComparableMapValue> {
private final int index;
private final String value;
public ComparableMapValue(int index, String value) {
this.index = index;
this.value = value;
}
public ComparableMapValue(String value) {
this.value = value;
index = insertionCounter++;
}
public String getValue() {
return value;
}
@Override
public int compareTo(ComparableMapValue o) {
return this.index - o.index;
}
@Override
public String toString() {
return value;
}
}
private void put(String key, String value) {
mm.put(key, new ComparableMapValue(value));
}
public void testInterleavedOutput() {
mm = TreeMultimap.create();
put("key1", "aaa");
put("key1", "bbb");
put("key3", "ggg");
put("key2", "sss");
put("key2", "eee");
put("key4", "aaa");
put("key3", "yyy");
Map<String, ComparableMapValue> lastValues = new HashMap<>();
int dummyCount = 0;
while (dummyCount < mm.keySet().size()) {
for (String key : mm.keySet()) {
NavigableSet<ComparableMapValue> navigableSet = mm.get(key);
ComparableMapValue value = lastValues.containsKey(key) ? lastValues.get(key) : navigableSet.first();
if (value == DUMMY) {
continue;
}
System.out.printf("%s: %s%n", key, value);
ComparableMapValue higher = navigableSet.higher(value);
if (higher == null) {
lastValues.put(key, DUMMY);
dummyCount++;
} else {
lastValues.put(key, higher);
}
}
}
}
}
您正在使用哪個多圖?它來自番石榴嗎? – sprinter
@sprinter是的。我使用番石榴multimap。我會更新這個問題。 – amal
該命令將很難實施。大多數多圖都會將相同密鑰的條目一起存儲在列表中。你可以迭代多次,每次只打印第n個這樣的條目,直到沒有更多。 – Thilo