У меня есть Map<byte[], Element>
, и я хочу отсортировать его и записать на диск, чтобы у меня был файл со всеми элементами, отсортированными по ключу через UnsignedBytes.lexicographicalComparator
.
в Guava.сейчас нужно сделать следующее:
HashMap<byte[], Element> memory;
// ... code creating and populating memory ...
TreeMap<byte[], Element> sortedMap = new TreeMap<byte[], Element>(UnsignedBytes.lexicographicalComparator());
sortedMap.putAll(memory.getMap());
MyWriter writer = new MyWriter("myfile.dat");
for (Element element: sortedMap.values())
writer.write(element);
writer.close();
Вероятно, трудно ускорить сортировку (O (nlogn)), вопрос в том, могу ли я улучшить навигацию в отсортированном списке.В идеале я бы отсортировал по ArrayList
вместо TreeMap
, чтобы итерация по нему была бы очень быстрой.
Я думал о том, чтобы поместить HashMap в ArrayList
и Collections.sort()
,но это потребовало бы большего копирования, чем фактическое решение.
Любые идеи?
Редактировать:
Я добавляю сюда свой тест с ArrayList
, что в 2 раза быстрее, но яПредположим, он использует больше памяти.Может быть, некоторые комментарии по этому предположению?
// ArrayList-based implementation 2x faster
ArrayList<Element> sorted = new ArrayList<Element>(memory.size());
sorted.addAll(memory.values());
final Comparator<byte[]> lexic = UnsignedBytes.lexicographicalComparator();
Collections.sort(sorted, new Comparator<Element>(){
public int compare(Element arg0, Element arg1) {
return lexic.compare(arg0.getKey(), arg1.getKey());
}
});
MyWriter writer = new MyWriter(filename);
for (Element element: sorted)
writer.write(element);
writer.close();