Как отсортировать ArrayList по убыванию вставленных целочисленных чисел типа String
Столкнулся с задачей отсортировать биржи по объему, от большего к меньшему, но, все перевести я должен в ArrayList, если с названием и URL проблем нет, то вот как отсортировать по убыванию думаю весь день. Методом .sort() не получается, к сожалению. Объект в ArrayList выглядит так:
4710,BitMart-https://www.bitmart.com/trade/en?layout=basic&symbol=XCAD_USDT| $XCAD / $USDT |
4710 — объем Как по нему отсортировать?
Отслеживать
задан 18 авг 2022 в 19:43
19 7 7 бронзовых знаков
Методом .sort() не получается что не получается?
18 авг 2022 в 19:44
вообще задача выглядит как «спарсить число из строки и по нему отсортировать»
18 авг 2022 в 19:45
Collections.sort(list, (d1, d2) -> d2.volume — d1.volume);
18 авг 2022 в 19:46
Что такое числовые числа типа String?
18 авг 2022 в 20:13
Не правильно выразился, целочисленные числа типа String Не 7, а «7»
19 авг 2022 в 8:37
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если «числовое число» находится в начале строки и после него следует запятая, можно вырезать подстроку до первой запятой при помощи String::substring + String::indexOf , преобразовать её в целое при помощи Integer::parseInt , и отсортировать при помощи Comparator.comparingInt + Comparator::reversed
list.sort( Comparator.comparingInt(s -> Integer.parseInt( s.substring(0, s.indexOf(",")) )) .reversed() );
Отслеживать
ответ дан 18 авг 2022 в 21:38
Nowhere Man Nowhere Man
13.8k 25 25 золотых знаков 17 17 серебряных знаков 29 29 бронзовых знаков
Да, это то что было мне нужно, храни тебя вселенная)
19 авг 2022 в 8:36
Если я правильно понял как у тебя хранятся данные в ArrayList То думаю можно сделать так:
List list = new ArrayList<>(); list.add("2"); list.add("1"); list.add("6"); list.add("5"); System.out.println(list.toString()); Вывод [2, 1, 6, 5] list.sort(new Comparator() < @Override public int compare(String o1, String o2) < return o1.compareTo(o2); >>); System.out.println(list.toString()); Вывод [1, 2, 5, 6]
UPD
list.add("2, F"); list.add("1, C"); list.add("6, A"); list.add("5, D"); Вывод [2, F, 1, C, 6, A, 5, D] list.sort(new Comparator() < @Override public int compare(String o1, String o2) < o1 = o1.substring(0, o1.indexOf(",")); o2 = o2.substring(0, o2.indexOf(",")); return o1.compareTo(o2); >>); Вывод [1, C, 2, F, 5, D, 6, A]
Сортировка ArrayList по полю объекта
Доступ к полю объекта в ArrayList
Здравствуйте, у меня есть ArrayList объектов Device(); Как обратиться к полям объекта Device() в.
сортировка элементов объекта по заданному полю
У меня есть массив объектов: let objArray = ; Его надо отсортировать по заданному полю (конкретно.
Сортировка данных объекта по одному полю
Мне нужно сделать сортировку в лексикографическом порядке mass -массив строк Что я делаю не так.
Сортировка массива по любому полю объекта
Мне нужно, чтобы можно было выбрать по какому полю объекта будет идти сортировка массива. Массив.
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
Почитай про интерфейс Comparator
Добавлено через 1 минуту
Ну, либо Comparable, если хош этот метод сортировки именно в класс запихать
Сортировка списков в Java
Для возможности сортировки объектов в коллекциях наследниках List в Java существует статический метод класса java.util.Collections .
Это значит вы можете сортировать элементы таких классов как ArrayList, LinkedList, CopyOnWriteArrayList и других классов, имплементирующих интерфейс List .
В общем виде, если у вас есть список из строк:
[z, b, c, a, k, z]
то после сортировки получите в списке порядок:
[a, b, c, k, z, z]
Простое использование метода sort() #
Если у нас в списке находятся объекты классов, которые известно как сравнить, то достаточно просто вызвать метод sort() и передать туда список. Таким образом в списке элементы поменяют порядок и будут отсортированы в порядке возрастания
//создание списка на основе массива var stringList = Arrays.asList("z", "b", "c", "a", "k", "z"); System.out.println(stringList); //сортировка списка в порядке возрастания Collections.sort(stringList); System.out.println(stringList);
Вывод в консоль:
[z, b, c, a, k, z] [a, b, c, k, z, z]
Так мы можем сортировать множество стандартных классов, таких как String, Integer, Double, Character и множество других.
Если более точно выразиться, то без дополнительных параметров возможно отсортировать список из любых элементов, классы которых имплементируют интерфейс сравнения Comparable .
Сортировка в обратном порядке #
Если мы хотим сортировать элементы в обратном порядке. То для этого передадим дополнительный аргумент в метод сортировки:
//создание списка на основе массива var stringList = Arrays.asList("z", "b", "c", "a", "k", "z"); System.out.println(stringList); //сортировка списка в обратном направлении Collections.sort(stringList, Collections.reverseOrder()); System.out.println(stringList);
[z, b, c, a, k, z] [z, z, k, c, b, a]
Добавляем возможность сортировки своих классов #
Если стандартные классы уже готовы к сортировке, то если мы напишем свой класс, то Java не знает как есть сравнивать с объектами этого же класса.
Чтобы научить сравнивать объекты есть два варианта:
- создать класс на основе Comparator и там прописать правила сравнения в методе int compare(T o1, T o2) . Полученный объект из класса использовать всегда, когда нам надо сортировать объекты. Такой вариант отлично подходит, когда нам надо сортировать объекты по разным правилам и можем использовать нужный нам класс Comparator.
- добавить в класс (являющимся, элементом списка) имплементацию интерфейса Comparable и прописать правила сравнения в методе int compareTo(T o) . Тогда не потребуется указывать каждый раз компаратор, данное правило сравнение будет по-умолчанию для этого объекта.
Оба метода возвращают целое число, которое обычно интерпретируется так:
- число больше 0 -> объект с которым сравнивают больше текущего
- число равно 0 -> объекты одинаковые
- число меньше 0 -> объект с которым сравнивают меньше текущего
Создадим свой класс, например для студента:
class Student private final String name; private final double avgMark; public Student(String name, double avgMark) this.name = name; this.avgMark = avgMark; > @Override public String toString() return " + name + '\'' + ", m=" + avgMark + '>'; > >
Класс специально минимально простой: все параметры задаются в конструкторе, и используются значения только для печати данных при вызове toString, что поможет нам в визуализации результата.
Для начала, посмотрим, что будет если мы попробуем отсортировать список из студентов:
var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9); var studentList = Arrays.asList(ivan, olga, eugene); System.out.println(studentList); //сортировка списка Collections.sort(studentList); System.out.println(studentList);
Такой код не скомпилируется, так как метод sort() не просто ожидает список, но еще важно, чтобы элемент списка был наследником Comparable:
public static T extends Comparable super T>> void sort(ListT> list) list.sort(null); >
Использование Comparable #
Для создания возможности сортировки, нам необходимо научить сравнить объекты с другими такого-же типа. И такая реализация будет использоваться по-умолчанию при сравнении объектов одного класса.
Имплементируем Comparable интерфейс, и реализуем метод compareTo:
class Student implements ComparableStudent> private final String name; private final double avgMark; public Student(String name, double avgMark) this.name = name; this.avgMark = avgMark; > @Override public String toString() return " + name + '\'' + ", m=" + avgMark + '>'; > @Override public int compareTo(Student o) return name.compareTo(o.name); > >
Обратите внимание, внутри метод мы решили сравнить две строки, а так как у String есть реализация Comparable — мы можем ее использовать.
В данном коде опущены части, с проверкой на null объектов o и полей класса.
Давайте проверим, как это будет работать:
var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9); var studentList = Arrays.asList(ivan, olga, eugene); System.out.println(studentList); //сортировка списка Collections.sort(studentList); System.out.println(studentList);
Все отлично, список отсортирован по полю name .
Вы можете делать более сложные условия сравнения, только не забывайте учитывать требование для успешной сортировки — два объекта, сколько бы мы их не сравнивали — должны всегда давать одинаковый результат.
Использование Comparator #
А что если нам надо сортировать студентов не по имени, а по средней оценке? И при этом оставить возможность сортировать по имени, которое должна использоваться по умолчанию для создания различных документов.
Нам на помощь придет отдельный класс Comparator , которые хранит в себе логику сравнения объектов и при сортировке, мы можем использовать нужное правило, то есть нужный объект класса Comparator .
Для начала добавим в класс Student геттеры, так как нам уже необходимо использовать данные класса в классе компаратора.
class Student implements ComparableStudent> private final String name; private final double avgMark; public Student(String name, double avgMark) this.name = name; this.avgMark = avgMark; > @Override public String toString() return " + name + '\'' + ", m=" + avgMark + '>'; > @Override public int compareTo(Student o) return name.compareTo(o.name); > public String getName() return name; > public double getAvgMark() return avgMark; > >
и теперь создадим класс Comparator , тип для сравнения Student :
class ComparatorByAvgMark implements ComparatorStudent> @Override public int compare(Student o1, Student o2) return Double.compare(o1.getAvgMark(), o2.getAvgMark()); > >
Мы снова использовали готовый метод для сравнения стандартного класса Double , это помогает не выдумывать свои реализации, а использовать уже существующие.
Также снова опущены проверки на null объектов o1, o2.
Теперь можно использовать данный класс, и в этот раз нам пригодится перегруженный метод Collections.sort() , который принимает компаратор:
var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9); var studentList = Arrays.asList(ivan, olga, eugene); System.out.println(studentList); //сортировка списка c использованием компаратора Collections.sort(studentList, new ComparatorByAvgMark()); System.out.println(studentList);
И мы видим — сортировка по возрастанию средней оценки студента.
Хорошо, давайте сделаем обратную сортировку, высокие оценки должны быть в начале списка. Для этого нам потребуется изменить поведение компаратора, и для этого у компаратора есть метод reversed() :
Collections.sort(studentList, new ComparatorByAvgMark().reversed());
и в итоге получим нужный результат:
Но это еще не все что может компаратор, можно создавать цепочки. Например, сначала сортируем по оценкам, а если оценки одинаковые, то по имени.
Это можно реализовать не создавая отдельного класса, а воспользоваться функцией:
Collections.sort(studentList, new ComparatorByAvgMark().reversed() .thenComparing(Student::getName));
При такой сортировки, оценки будут в порядке убывания, а внутри одной средней оценки, студенты будут по имени в порядке возрастания.
Метод sort() у самого списка #
Кроме использования метода Collections.sort() , можно вызывать похожий метод у самого списка List.sort() . Метод принимает один аргумент — компаратор.
На примере списка студентов:
studentList.sort(new ComparatorByAvgMark());
Как отсортировать ArrayList в Java
По умолчанию элементы ArrayList отображаются в соответствии с последовательностью, в которой они находятся. Часто вам может понадобиться отсортировать ArrayList, чтобы упорядочить его в алфавитном порядке. В этом примере показано использование Collections.sort (‘List’) для сортировки ArrayList .
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SortArrayList < public static void main(String args[])< ListunsortList = new ArrayList(); unsortList.add("CCC"); unsortList.add("111"); unsortList.add("AAA"); unsortList.add("BBB"); unsortList.add("ccc"); unsortList.add("bbb"); unsortList.add("aaa"); unsortList.add("333"); unsortList.add("222"); // перед сортировкой System.out.println("ArrayList is unsort"); for(String temp: unsortList) < System.out.println(temp); >// сортируем список Collections.sort(unsortList); // после сортировки System.out.println("ArrayList is sorted"); for(String temp: unsortList) < System.out.println(temp); >> >
ArrayList is unsort CCC 111 AAA BBB ccc bbb aaa 333 222 ArrayList is sorted 111 222 333 AAA BBB CCC aaa bbb ccc
Ссылка
- Список таблиц ASCII
- Collections.sort () документация