Кажется, есть две проблемы с кодом. Первый заключается в следующем:
String str="";
for(String s: mylist) {
str+=s+",";
}
String[] sArr = str.split(",");
Здесь, по-видимому без причины, вступив в коллекцию строк, а затем разбить его снова в массив. Это усугубляется тем фактом, что вы используете конкатенацию строк (оператор +
).
В Java строки являются неизменяемыми объектами. Это означает, что каждая операция, которая выглядит так, как будто это изменение строкового объекта, фактически создает новый. Каждый раз, когда вы делаете str+=s+","
, вы создаете новые объекты. Повторение этой тысячи раз очень неэффективно.
Если вам нужно составить String
вот так, вы должны использовать StringBuilder
. Хотя, в данном случае, я не думаю, что это необходимо вообще.
Если я правильно понял ваш код, кажется, что список mylist
уже содержит свои записи в следующем формате:
["A 0.53", "B 0.56", ...]
Если это так, то вы можете сортировать mylist
непосредственно.
Отсюда я буду считать, что mylist
является List<String>
. Если это не так, и mylist
действительно String[]
, вам просто нужно использовать Arrays.sort(mylist, comparator)
вместо mylist.sort(comparator)
.
Во-первых, вам нужен метод для извлечения значения Double
из String
записей, как я полагаю, вы пытаетесь сравнить числами, как double
, а не String
.
static Double doubleFromRecord(String record) {
return Double.valueOf(record.split("\\s")[1]);
}
Так, doubleFromRecord("A 0.53")
возвращает 0.53
как Double
.
Теперь вам просто нужно позвонить sort
непосредственно на mylist
пропускании Comparator
, который будет сравнивать числа из различных элементов:
mylist.sort((r1, r2) -> doubleFromRecord(r1).compareTo(doubleFromRecord(r2)));
И mylist
будет отсортирован.
Компаратор:
(r1, r2) -> doubleFromRecord(r1).compareTo(doubleFromRecord(r2))
Просто принимает два элемента из mylist
и возвращает результат сравнения их части числа.
Если можно, я хотел бы предложить вам создать класс для ваших записей, таких как:
class Record {
final String label;
final double value;
Record(String label, double value) {
this.label = label;
this.value = value;
}
}
И работать с List<Record>
вместо List<String>
. Таким образом, вы можете легко сделать:
myRecordList.sort((r1, r2) -> Double.compare(r1.value, r2.value));
Для начала, вы можете использовать предварительно построенный оптимизированный метод сортировки, как 'Arrays.sort' ... –
использовать также другой алгоритм сортировки, как быстрой сортировки, слияния-сортировки. Также не называйте 'split (" \\ s ")' в каждом сравнении (это довольно дорогой вызов). Вместо этого создайте отдельный класс, в котором вы сохраните свои значения. – Pshemo
вы также должны использовать 'StringBuilder' вместо' + = ', когда вы перебираете список, но для 1000 элементов это не должно быть заметно, но лучше всего было бы лучше. Кроме того, количество манипуляций с строками способствует медленной сортировке, но, как говорят другие люди, измените свой алгоритм сортировки, а также – sfat