Я согласен, что Multimap
не лучшая структура данных для того, что вы пытаетесь достичь; a Map
из Lists
может работать здесь лучше. MultiMap
сортирует значения в соответствии с их естественным порядком (если не поставляется с обычным компаратором). Если я правильно понимаю, то вам нужно заказывать время вставки (игнорируя ошибку ggg
в ожидаемом выходе, на что указывает @Louis Wasserman). Я не могу придумать, как добиться этого, не изменяя тип значения карты с String
в пользовательский класс. Ниже приведен фрагмент ниже.
TreeMultimap
представляет значения как NavigableSet
, в которых не все равно случайные acces (опять же, аргумент для выбора другого контейнера) - следовательно, необходимо использовать последний кеш значений для чередующегося вывода.
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 Да. Я использую многоадресную рассылку Guava. Я обновлю вопрос. – amal
Этот порядок будет сложным для реализации. Большинство мультикадров будут хранить записи для одного и того же ключа вместе в списке. Вы можете повторять много раз, каждый раз печатайте 'n'th такую запись только, пока их больше нет. – Thilo