Я бы воспользовался встроенными возможностями сортировки 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');
}
}
Наконец, поместите все свои элементы в массив и используйте для сортировки встроенные (и очень эффективные по памяти) методы Arrays. Например:
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, включая Arrays.sort).
Часто, если вы пытаетесь стать слишком умным, вы просто оптимизируете себя прямо из эффективного решения. :)