Я думаю, что ваш подход к использованию списка списков в основном хорош, но может быть спроектирован так, чтобы быть более компактным.
Во-первых, убедитесь, что вы канонизируете прочитанные имена. То есть в памяти должен быть только один экземпляр строки с символами «SOLEXA3_1: 3: 5: 1473: 616/1»; используйте карту, чтобы свести имена к каноническому экземпляру перед их использованием.
Во-вторых, идентификаторы попаданий всегда целые? Если это так, храните их как таковые (например, longs, поскольку некоторые из них, очевидно, слишком велики, чтобы поместиться в них).
В-третьих, я думаю, что вы можете хранить хиты и их партитуры в очень компактной структуре, если вы готовы выполнить некоторую работу, вручную упаковав оба в длинный (!). Затем вы можете просто хранить отсортированный массив длин для каждого входа.
Вот как я могу канонизировать прочитанные имена:
Map<String, String> names = new HashMap<String, String>();
public String getCanonicalInstanceOfName(String name) {
String canonicalName = names.get(name);
if (canonicalName != null) {
name = canonicalName;
}
else {
names.put(name, name);
}
return name;
}
Я могу придумать хотя бы один разумный способ сделать это, но пока это подойдет.
Вот как бы я справился с оценкой попаданий:
public long packHitIDAndScore(String id, float score) {
long numericID = Long.parseLong(id);
int scoreAsHundredthsOfAPercent = (int)(score * 100.0);
long packedIDAndScore = (numericID << 14) + scoreAsHundredthsOfAPercent;
return packedIDAndScore;
}
14 существует потому, что 14 двоичных битов достаточно велики для хранения значений до 16384, что достаточно для хранения диапазона от 0 до 10000. Обратите внимание, что для идентификатора вы получите только 50 битов, так что было бы полезно проверка, что ни один ID не был больше, чем 1125899906842623.
Поскольку вы используете Trove, вы можете хранить упакованные длинные позиции в TLongArrayList. Сохраните список отсортированным с помощью binarySearch, чтобы найти подходящее место для каждого длинного присоединения к списку, и вставьте, чтобы поместить его туда. Чтобы найти значение в списке, снова используйте binarySearch.