admin / 07.06.2018

javatalks.ru / Сортировка по длине слов


Да, ты можешь. Существует два варианта сравнения элементов, интерфейса 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, вы найдете много материала, чтобы вы начали.

[Java] Сортировка ArrayList пользовательских объектов по свойству

02 авг 2015 21:42  

DenisStifler

Подскажите, имеется текстовый файл со строками:
World!
Hello
And how do you do?
And how do you do?And how do you do?
aa

Задача: Требуется скопировать строки из файла, и вставить в другой файл (записать эти строки в отсортированном по длине порядке)
Решение: Пока только просто копирует из файла А строки и вставляет в файл Б.

Помогите с сортировкой по длине???(((((
import java.io.*; public class Test { public static void main(String[] args) throws IOException { String line [] = new String[4]; BufferedReader reader = null; BufferedWriter writer = null; try { reader = new BufferedReader(new FileReader("C:\\Users\\Denis Stifler\\Documents\\aa.txt")); writer = new BufferedWriter(new FileWriter("C:\\Users\\Denis Stifler\\Documents\\Rainmeter\\bb.txt")); for (int i = 0; i < line.length; i++) { while ((line[i] = reader.readLine()) != null) { writer.write(line[i] + "\n"); } } System.out.println("OK"); } catch (Exception e) { System.out.println(e.toString()); } finally { reader.close(); writer.close(); } } }

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(); } }
Далее помещаем все строки в массив.

К примеру
test = new String[]{"St01", "St01", "St02","St1","St001"}; Comparator<String> comparator = new LengthComparator(); Arrays.sort(test, new LengthComparator()); for (String s: test ){ System.out.println(s); }

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; } }
Модераторы:frymock
Сейчас эту тему просматривают:Нет
javatalks — Форум Java программистовФорум Java программистовjavatalks.ru / 2006 — {current_year} © javatalks.ru551200true

javatalks.ru

Сортировка в Java — легко!

Временами сортировка массивов простых типов в Java заставляет нас потрудиться. Не говоря о сортировке массивов объектов.

Сортировка ArrayList объектов с использованием пользовательского порядка сортировки

Теперь же мы можем сортировать и массивы простых типов и массивы объектов, написав относительно малый код, с помощью интерфейса 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
Перевод Станислав Песоцкий.

Comparable и Comparator

Два новых интерфейса java.lang.Comparable и java.util.Comparator были добавлены в версии Java 5. Использование данных интерфейcов в своих приложениях позволяет упорядочивать (сортировать) данные.

Интерфейс Comparable

В интерфейсе Comparable объявлен только один метод compareTo (Object obj), предназначенный для упорядочивания объектов класса. Данный метод удобно использовать для сортировки списков или массивов объектов.

Метод compareTo (Object obj) сравнивает вызываемый объект с obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:

  • 0, если значения равны;
  • Отрицательное значение (обычно -1), если вызываемый объект меньше obj;
  • Положительное значение (обычно +1), если вызываемый объект больше obj.

Если типы объектов не совместимы при сравнении, то compareTo (Object obj) может вызвать исключение ClassCastException. Необходимо помнить, что аргумент метода compareTo имеет тип сравниваемого объекта класса.

Обычные классы Byte, Short, Integer, Long, Double, Float, Character, String уже реализуют интерфейс Comparable.

Пример реализации интерфейса Comparable

package test; import java.util.TreeSet; class Compare implements Comparable<Object> { String str; int num; String TEMPLATE = "num = %d, str = ‘%s’"; Compare(String str, int num) { this.str = str; this.num = num; } @Override public int compareTo(Object obj) { Compare entry = (Compare) obj; int result = str.compareTo(entry.str); if(result != 0) return result; result = num — entry.num; if(result != 0) return (int) result / Math.abs( result ); return 0; } @Override public String toString() { return String.format(TEMPLATE, num, str); } } public class Example { public static void main(String[] args) { TreeSet<Compare> data = new TreeSet<Compare>(); data.add(new Compare("Начальная школа" , 234)); data.add(new Compare("Начальная школа" , 132)); data.add(new Compare("Средняя школа" , 357)); data.add(new Compare("Высшая школа" , 246)); data.add(new Compare("Музыкальная школа", 789)); for (Compare e : data) System.out.println(e.toString()); } }

Результат выполнения программы:

num = 246, str = ‘Высшая школа’ num = 789, str = ‘Музыкальная школа’ num = 132, str = ‘Начальная школа’ num = 234, str = ‘Начальная школа’ num = 357, str = ‘Средняя школа’  

В примере значения сортируются сначала по полю str (по алфавиту), а затем по num в методе compareTo.

Это хорошо видно по двум строкам с одинаковыми значения str и различными num. Чтобы изменить порядок сортировки значения str (в обратном порядке), необходимо внести небольшие изменения в метод compareTo.

@Override public int compareTo(Object obj) { int result = ((Comp)obj).str.compareTo(str); if(result != 0) return result; result = entry.number — number; if(result != 0) { return (int) result / Math.abs(result); return 0; }

Интерфейс Comparator : compare, compareTo

В интерфейсе Comparator объявлен метод compare (Object obj1, Object obj2), который позволяет сравнивать между собой два объекта.

Как отсортировать ArrayList?

На выходе метод возвращает значение 0, если объекты равны, положительное значение или отрицательное значение, если объекты не тождественны.

Метод может вызвать исключение ClassCastException, если типы объектов не совместимы при сравнении. Простой пример реализации интерфейса Comparator:

package test; import java.util.TreeSet; import java.util.Iterator; import java.util.Comparator; class Compare implements Comparator<String> { @Override public int compare(String obj1, String obj2) { return obj1.compareTo(obj2); } } public class Example { public static void main(String[] args) { TreeSet<String> data = new TreeSet<String>(); data.add(new String("Змей Горыныч" )); data.add(new String("Баба Яга" )); data.add(new String("Илья Муромец" )); data.add(new String("Алеша Попович" )); data.add(new String("Соловей Разбойник")); Iterator<String> i = data.iterator(); while(i.hasNext()) System.out.println(i.next()); } }

Результат выполнения программы:

Алеша Попович Баба Яга Змей Горыныч Илья Муромец Соловей Разбойник  

Усложним пример, и реализуем несколько видов сортировки. Для этого создадим класс Product с полями name, price и quantity.

class Product { private String name; private float price; private float quantity; public Product (String name, float price, float quantity) { this.name = name; this.price = price; this.quantity = quantity; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public float getQuantity() { return quantity; } public void setQuantity(float quantity) { this.quantity = quantity; } @Override public String toString() { return "Наименование ‘" + name + "’, цена — " + String.valueOf (price) + ", количество — " + String.valueOf (quantity); } }

Создадим два класса (SortedByName, SortedByPrice), реализующих интерфейс Comparator для сортировки объектов по названию и по цене :

// сортировка по названию class SortedByName implements Comparator<Product> { public int compare(Product obj1, Product obj2) { String str1 = obj1.getName(); String str2 = obj2.getName(); return str1.compareTo(str2); } } // сортировка по цене class SortedByPrice implements Comparator<Product> { public int compare(Product obj1, Product obj2) { float price1 = obj1.getPrice(); float price2 = obj2.getPrice(); if (price1 > price2) { return 1; } else if (price1 < price2) { return -1; } else { return 0; } } }

Пример использования Arrays.sort :

public class Example { public static void main(String[] args) { Product[] products = new Product[3]; // заполним объект Product содержимым products[0] = new Product("Молоко", (float) 35.56, (float)900.00); products[1] = new Product("Кофе" , (float)199.50, (float) 90.00); products[2] = new Product("Чай" , (float) 78.50, (float)150.00); // выведем данные без сортировки System.out.println("~~~~~ без сортировки ~~~~~"); for(Product product : products) System.out.println(product.toString()); // Сортировка по цене Arrays.sort(products, new SortedByPrice()); System.out.println("\n~~~~~ сортировка по цене ~~~~~"); for(Product product : products) System.out.println(product.toString()); // Сортировка по названию Arrays.sort(products, new SortedByName()); System.out.println("\n~~~~~ сортировка по названию ~~~~~"); for(Product product : products) System.out.println(product.toString()); } }

Результат выполнения программы:

~~~~~ без сортировки ~~~~~ Наименование ‘Молоко’, цена — 35.56, количество — 900.0 Наименование ‘Кофе’, цена — 199.5, количество — 90.0 Наименование ‘Чай’, цена — 78.5, количество — 150.0 ~~~~~ сортировка по цене ~~~~~ Наименование ‘Молоко’, цена — 35.56, количество — 900.0 Наименование ‘Чай’, цена — 78.5, количество — 150.0 Наименование ‘Кофе’, цена — 199.5, количество — 90.0 ~~~~~ сортировка по названию ~~~~~ Наименование ‘Кофе’, цена — 199.5, количество — 90.0 Наименование ‘Молоко’, цена — 35.56, количество — 900.0 Наименование ‘Чай’, цена — 78.5, количество — 150.0  

Для сортировки объектов были реализованы два независимых компаратора по наименованию и по цене (SortedByName и SortedByPrice). Сортировка выполняется с помощью класса Arrays, у которого есть метод sort. Данный метод в качестве второго аргумента принимает тип компаратора.

Arrays.sort(T[] arg1, Comparator<? super T> arg2);

Можно использовать также метод sort класса Collections, который в качестве первого входного аргумента принимает список объектов:

Collections.sort(List<T> arg1, Comparator<? super T> arg2);

Отличие интерфейсов Comparator и Comparable

Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика).

Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках).

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*