Я бы воспользовался Java (очень эффективным), встроенным в функции сортировки. Начнем с того, определить простой класс, чтобы содержать вашу строку и метаданные:
class Item
{
// Your string. It's public, so you can get it if you want,
// but also final, so you can't accidentally change it.
public final String string;
// An array of counts, where the offset is the alphabetical position
// of the letter it's counting. (A = 0, B = 1, C=2...)
private final short[] instanceCounts = new short[32];
public Item(String string)
{
this.string = string;
for(char c : string.toCharArray())
{
// Increment the count for this character
instanceCounts[(byte)c - 65] ++;
}
}
public int getCount(char c)
{
return instanceCounts[(byte)c - 65];
}
}
Это будет держать вашу строку (для поиска и отображения), а также создать массив трусах с кол-согласующих символов. (Если у вас действительно с низким объемом памяти, и вы знаете, что ваши строки имеют более 255 любого символа, вы можете даже изменить это на массив байтов.) Короткий - это всего лишь 16 байт, поэтому сам массив будет возьмите 64 байта вместе независимо от того, насколько сложна ваша строка. Если вы хотите заплатить за хит производительности за вычисление счетчиков каждый раз, вы можете избавиться от массива и заменить метод getCount(), но вы, вероятно, в конечном итоге сохраните единовременную память, потребляя часто-мусор память, которая является большим хитом производительности.:)
Теперь определите правило, которое вы хотите искать, используя Comparator. Например, для сортировки по количеству A-ых в вашей строке:
class CompareByNumberOfA implements Comparator<Item>
{
public int compare(Item arg0, Item arg1)
{
return arg1.getCount('A') - arg0.getCount('A');
}
}
Наконец, придерживаться всех ваших элементов в массиве, а также использовать встроенный (и очень эффективной памяти) Массивы методов сортировки. Например:
public static void main(String args[])
{
Item[] items = new Item[5];
items[0]= new Item("ABC");
items[1]= new Item("ABCAA");
items[2]= new Item("ABCAAC");
items[3]= new Item("ABCAAA");
items[4]= new Item("ABBABZ");
// THIS IS THE IMPORTANT PART!
Arrays.sort(items, new CompareByNumberOfA());
System.out.println(items[0].string);
System.out.println(items[1].string);
System.out.println(items[2].string);
System.out.println(items[3].string);
System.out.println(items[4].string);
}
Вы можете определить целую кучу компараторов и использовать их как вам нравится.
Одна из вещей, которые нужно запомнить о кодировании с помощью Java, - это не слишком умно. Составители делают чертовски прекрасную работу по оптимизации своей платформы, до тех пор, пока вы воспользуетесь вещами, которые может оптимизировать (например, встроенные API, включая Array.sort).
Часто, если вы пытаетесь стать слишком умным, вы просто оптимизируете себя из эффективного решения. :)
Если вы имеете дело с большим количеством данных, чем вы можете поместиться в память сразу, у слияния есть хорошие характеристики io – chucksmash
Можете ли вы показать нам свою текущую реализацию? Возможно, было бы проще оптимизировать вашу текущую реализацию, чем начинать с нуля. –
Мне жаль, что я не код, но код не мой для публикации, но в основном это сочетание словаря с hashmap ... он работает нормально, но он имеет огромный размер, что делает его непригодным для мобильных устройств ... Я думаю, возможно, было бы лучше всего сохранить все это на сервере, но мне нужно иметь возможность сортировать его по поддоменам ... – Astronaut