Guava multimap, который использует TreeMap, а не HashMap?

У меня есть что-то вроде следующего:

final SortedMap<Integer,List<Integer>> m = new TreeMap<Integer,List<Integer>>();

И я бы хотел использовать google-guava, чтобы сделать это мультимапом. Однако я не вижу никакой реализации, которая предоставляет SortedMap, содержащую ArrayList. Я вижу только реализацию HashMap + ArrayList (ArrayListMultimap). Существует ли реализация, которую я хочу?

Ответ 1

В Guava есть TreeMultimap, в котором хранятся как ключи, так и значения в отсортированном порядке. Однако для значений, а не List используется TreeSet, поэтому может быть не совсем то, что вы хотите здесь. В этом случае Guava позволяет создать Multimap, который работает любым способом, используя один из методов Multimaps.new*Multimap, например Multimaps.newListMultimap. Чтобы создать тот, который работает так, как вы описываете, вы просто напишете это:

Map<Integer, Collection<Integer>> map = Maps.newTreeMap();
ListMultimap<Integer, Integer> m = Multimaps.newListMultimap(map,
    new Supplier<List<Integer>>() {
      public List<Integer> get() {
        return Lists.newArrayList(); // assuming you want to use ArrayList
      }
    });

Ответ 2

Здесь вы можете создать этого зверя:

Multimap<Integer,Integer> multimap = Multimaps.newListMultimap(
    Maps.<Integer, Collection<Integer>>newTreeMap(),
    new Supplier<List<Integer>>() {
        public List<Integer> get() {
            return Lists.newArrayList();
        }
    });