Ответ зависит от того, что вы подразумеваете под «наиболее эффективным», «ужасно неэффективным» и «занимает вечность». Это субъективные термины. Ответ также может зависеть от конкретных c технических факторов (скорость и потребление памяти; количество уникальных ключей полета по сравнению с общим количеством записей; et c.).
Я бы порекомендовал применить немного основы c упрощения вашего кода, для начала. Посмотрите, даст ли это вам лучший (приемлемый) результат. Если вам нужно больше, тогда вы можете рассмотреть более продвинутые улучшения.
Что бы вы ни делали, потратьте немного времени, чтобы понять общие последствия любых изменений, которые вы делаете.
Сосредоточьтесь на переходе от «ужасного» к «приемлемому», а затем подумайте о более продвинутой настройке после этого (если она вам все еще нужна).
Попробуйте использовать BufferedReader
вместо Scanner
. Смотрите здесь . Хотя сканер может подойти для ваших нужд (т. Е. Если он не является узким местом).
Рассмотрите возможность использования logi c в вашем сканере l oop для захвата хвостовых чисел и накопленного пробега за один проход данные. Ниже приведено намеренно основа c, для ясности и простоты:
// The string is a tail number.
// The integer holds the accumulated miles flown for that tail number:
Map<String, Integer> planeMileages = new HashMap();
if (planeMileages.containsKey(tailNumber)) {
// add miles to existing total:
int accumulatedMileage = planeMileages.get(tailNumber) + flightMileage;
planeMileages.put(tailNumber, accumulatedMileage);
} else {
// capture new tail number:
planeMileages.put(tailNumber, flightMileage);
}
После того, как вы завершили сканер l oop, вы можете выполнить итерацию по вашему planeMileages
, чтобы найти самый большой пробег :
String maxMilesTailNumber;
int maxMiles = 0;
for (Map.Entry<String, Integer> entry : planeMileages.entrySet()) {
int planeMiles = entry.getValue();
if (planeMiles > maxMiles) {
maxMilesTailNumber = entry.getKey();
maxMiles = planeMiles;
}
}
ПРЕДУПРЕЖДЕНИЕ - Этот подход только для иллюстрации. Он будет захватывать только один номер хвоста. Может быть несколько самолетов с одинаковым максимальным пробегом. Вам нужно настроить логику c для захвата нескольких «победителей».
Приведенный выше подход устраняет необходимость в нескольких ваших существующих структурах данных и связанной с ними обработке.
Если вы по-прежнему Столкнувшись с проблемами, установите некоторые таймеры, чтобы увидеть, какие конкретно области вашего кода c медленнее - и тогда у вас будет больше возможностей для настройки c, на которые вы можете сфокусироваться.