admin / 07.06.2018
Да, ты можешь. Существует два варианта сравнения элементов, интерфейса Comparable и интерфейса Comparator .
Оба этих интерфейса допускают различное поведение. Comparable позволяет вам заставить объект действовать так, как вы только что описали Strings (на самом деле String реализует Comparable). Второй, Компаратор, позволяет делать то, что вы просите. Вы сделали бы это так:
Это заставит метод Collections.sort использовать ваш компаратор для его механизма сортировки. Если объекты в массиве ArrayList сопоставимы, вы можете сделать что-то вроде этого:
Класс Collections содержит ряд этих полезных, общих инструментов.
Вы можете использовать Bean Comparator для сортировки по любому свойству в вашем пользовательском классе.
Я предпочитаю этот процесс:
Если в списке объектов есть свойство , вы вызываете его снова и снова. Вы даже можете их .
Это требует, чтобы ваш объект был что означает, что вам нужна реализация , и .
Да, это может быть быстрее … Но теперь вам не нужно создавать новый компаратор для каждого типа сортировки. Если вы можете сэкономить время разработки и отказаться от времени выполнения, вы можете пойти с этим.
С помощью этой библиотеки вы можете отсортировать список настраиваемых объектов на нескольких столбцах. Библиотека использует возможности версии 8.0. Образец также доступен там. Вот пример, который нужно сделать
Поскольку технологии появляются каждый день, ответ будет меняться во времени. Я взглянул на LambdaJ и кажется очень интересным.
Вы можете решить эти задачи с помощью LambdaJ . Вы можете найти его здесь: http://code.google.com/p/lambdaj/
Здесь у вас есть пример:
Сортировка итераций
Сортировать по лямбда
Конечно, такая красота влияет на производительность (в среднем 2 раза), но вы можете найти более читаемый код?
Начиная с и далее нам не нужно напрямую использовать . Интерфейс имеет метод по умолчанию:
См. http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
С помощью Java 8 вы можете использовать ссылку на метод для вашего компаратора:
Этот фрагмент кода может оказаться полезным. Если вы хотите отсортировать объект в моем случае, я хочу сортировать по VolumeName:
Это работает. Я использую его в своем jsp.
Использование Java 8 позволяет определить в одной строке с помощью
Используйте любой из следующих способов:
Опция 1:
Вариант 2:
Java 8 Lambda сокращает сортировку.
Вы можете ознакомиться с этой presentation на Форуме Java в Штутгарте Германия в 2016 году.
Только несколько слайдов используют немецкий язык, 99% контента — исходный код Java на английском языке; как
где использует методы по умолчанию (и другие интересные идеи). Как показано, приводя к очень сжатому коду, чтобы выбрать некоторый метод getter для сортировки; и супер простое соединение (или реверсирование) критериев сортировки.
Если вы находитесь в java8, вы найдете много материала, чтобы вы начали.
Содержание
02 авг 2015 21:42 | |
DenisStifler |
Подскажите, имеется текстовый файл со строками:
World! Hello And how do you do? And how do you do?And how do you do? aa Задача: Требуется скопировать строки из файла, и вставить в другой файл (записать эти строки в отсортированном по длине порядке) Помогите с сортировкой по длине???((((( |
02 авг 2015 22:16 | |
umo4ka |
//создаем массив String[] strArray = {"World!", "Hello", "And how do you do?", "aa", "And how do you do?And how do you do?"}; //сортировка пузырьком for(int i = 0; i < strArray.length; i++){ for(int j = 0; j < strArray.length — 1 — i; j++){ if(strArray[j].length() > strArray[j + 1].length()){ String str = strArray[j]; strArray[j] = strArray[j + 1]; strArray[j + 1] = str; } } } //вывод массива for(String s : strArray){ System.out.println(s); }
Сортировка пузырьком |
Изменен:02 авг 2015 19:17 |
02 авг 2015 22:23 | |
DarkMaster |
List<String> list = new ArrayList<>(); list.add("How R U?"); list.add("Wow"); list.add("Hello"); list.add("a"); Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() — o2.length(); } }); for (String s : list) { System.out.println(s); }
|
26 янв 2017 23:51 | |
Varfalomei |
Еще есть такой вариант (взят из учебника Хорстманна)
Реализуем интерфейс java.util.Comparator<T> public class LengthComparator implements java.util.Comparator<String> { @Override public int compare(String o1, String o2) { return o1.length()-o2.length(); } } Далее помещаем все строки в массив. К примеру |
27 янв 2017 00:56 | |
Scimitar |
import java.io.*; import java.nio.charset.Charset; import java.util.*; public class Sort { public static void main(String[] args) throws IOException { List<String> l = new ArrayList<>(); int index = 0; BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream("Txt.txt"), Charset.forName("UTF-8"))); String s; while((s = br.readLine())!=null){ l.add(s); } br.close(); br = null; Collections.sort(l, new Comparator<String>() { @Override public int compare(String o1, String o2) { return (o1.length() — o2.length()); } }); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("out.txt"),Charset.forName("UTF-8") )); for (String s1:l){ bw.write(s1); bw.write('\n'); } bw.flush(); bw.close(); bw = null; } }
|
javatalks.ru
Временами сортировка массивов простых типов в Java заставляет нас потрудиться. Не говоря о сортировке массивов объектов.
Теперь же мы можем сортировать и массивы простых типов и массивы объектов, написав относительно малый код, с помощью интерфейса Comparable.
java.util.Comparable это класс, содержащий определение правильного порядка двух объектов. Это применимо только для небольшого числа классов, которые по умолчанию реализованы в интерфейсе Comparable. Один из них — это класс String. В реализации интерфейса Comparable класс String перегружает метод compareTo(Object obj). Метод compareTo(Object obj) возвращает отрицательное integer, ноль или положительное integer, когда текущее значение меньше чем, равно, или больше чем полученный объект.
Ваша работа уже выполнена за вас в классе String. Тем не менее, если вы хотите обеспечить способность сортировки ваших собственных классов, тогда вы должны реализовать(implement) Comparable и перегружать compareTo(Object obj) самостоятельно. Ниже следует простой пример, в котором определен класс Student. Каждый Student содержит studentid, first_name, last_name. Согласно нашим спецификациям Student можно сортировать по student_id.
import java.util.*; public class Student implements Comparable { public int student_id; public String last_name; public String first_name; public Student(int student_id, String last_name, String first_name) { this.student_id = student_id; this.last_name = last_name; this.first_name = first_name; } /* Перегрузка метода compareTo */ public int compareTo(Object obj) { Student tmp = (Student)obj; if(this.student_id < tmp.student_id) { /* текущее меньше полученного */ return -1; } else if(this.student_id > tmp.student_id) { /* текущее больше полученного */ return 1; } /* текущее равно полученному */ return 0; } }
Теперь, когда в классе Student перегружен метод compareTo(Object obj), мы легко можем сортировать массив объектов типа Student. Здесь использовался класс java.util.Array и его статический метод sort. Метод main добавлен, чтобы продемонстрировать, как это будет работать.
public static void main(String[] args) { /* Создание массива объектов Student */ Student[] students = new Student[3]; students[0] = new Student(52645,»Smith»,»Bob»); students[1] = new Student(98765,»Jones»,»Will»); students[2] = new Student(1354,»Johnson»,»Matt»); /* Сортировка массива */ Arrays.sort(students); /* Печать отсортированных значений */ for(int i = 0; i < students.length; i++) { System.out.println(students[i].student_id + students[i].last_name + students[i].first_name); } }
Действительно просто? Чуть-чуть работы и класс Student можно заставить сортировать по комбинации полей. Например, вы захотите сортировать сначала по last_name, а затем по student_id. Не забывайте, что класс Arrays может сортировать любой массив, включая массив элементов простых типов. Для простых типов, однако, нет необходимости в реализации (implement) Comparable. И без этого очень легко сортировать int, float и т.п.
VanGlass
Перевод Станислав Песоцкий.
Два новых интерфейса java.lang.Comparable и java.util.Comparator были добавлены в версии Java 5. Использование данных интерфейcов в своих приложениях позволяет упорядочивать (сортировать) данные.
В интерфейсе Comparable объявлен только один метод compareTo (Object obj), предназначенный для упорядочивания объектов класса. Данный метод удобно использовать для сортировки списков или массивов объектов.
Метод compareTo (Object obj) сравнивает вызываемый объект с obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:
Если типы объектов не совместимы при сравнении, то compareTo (Object obj) может вызвать исключение ClassCastException. Необходимо помнить, что аргумент метода compareTo имеет тип сравниваемого объекта класса.
Обычные классы Byte, Short, Integer, Long, Double, Float, Character, String уже реализуют интерфейс Comparable.
Результат выполнения программы:
В примере значения сортируются сначала по полю str (по алфавиту), а затем по num в методе compareTo.
Это хорошо видно по двум строкам с одинаковыми значения str и различными num. Чтобы изменить порядок сортировки значения str (в обратном порядке), необходимо внести небольшие изменения в метод compareTo.
В интерфейсе Comparator объявлен метод compare (Object obj1, Object obj2), который позволяет сравнивать между собой два объекта.
На выходе метод возвращает значение 0, если объекты равны, положительное значение или отрицательное значение, если объекты не тождественны.
Метод может вызвать исключение ClassCastException, если типы объектов не совместимы при сравнении. Простой пример реализации интерфейса Comparator:
Результат выполнения программы:
Усложним пример, и реализуем несколько видов сортировки. Для этого создадим класс Product с полями name, price и quantity.
Создадим два класса (SortedByName, SortedByPrice), реализующих интерфейс Comparator для сортировки объектов по названию и по цене :
Результат выполнения программы:
Для сортировки объектов были реализованы два независимых компаратора по наименованию и по цене (SortedByName и SortedByPrice). Сортировка выполняется с помощью класса Arrays, у которого есть метод sort. Данный метод в качестве второго аргумента принимает тип компаратора.
Можно использовать также метод sort класса Collections, который в качестве первого входного аргумента принимает список объектов:
Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика).
Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках).
FILED UNDER : IT