Java сортировка массива строк

Sorting an array of String with custom ordering

But I need to implement the following ordering: FCBWHJLOAQUXMPVINTKGZERDYS I think I need to implement Comparator and override compare method:

 Arrays.sort(str, new Comparator() < @Override public int compare(String o1, String o2) < // TODO Auto-generated method stub return 0; >>); 

Firstly, you should consider using a character array if your items are always one character in length. Using strings forces more error checking.

@Sam: so each individual character in the string needs to be sorted by the order and then «normal» string rules apply? How is «AA» sorted relative to «A»? Or «FC» relative to «FB»?

@JoachimSauer I don’t know if I got your point correctly. But the order should be: «FC»,»FB»,»A»,»AA»

4 Answers 4

final String ORDER= "FCBWHJLOAQUXMPVINTKGZERDYS"; Arrays.sort(str, new Comparator() < @Override public int compare(String o1, String o2) < return ORDER.indexOf(o1) - ORDER.indexOf(o2) ; >>); 

If your array is case in-sensitive.

Apparently the OP wants to compare not only letters but strings of letters, so it’s a bit more complicated:

 public int compare(String o1, String o2) < int pos1 = 0; int pos2 = 0; for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) < pos1 = ORDER.indexOf(o1.charAt(i)); pos2 = ORDER.indexOf(o2.charAt(i)); >if (pos1 == pos2 && o1.length() != o2.length()) < return o1.length() - o2.length(); >return pos1 - pos2 ; > 

It’s not correct. The answer provided would work only if you gave it 1 length string or strings that are a substring of ORDER (for example — JLO)

Читайте также:  Сформировать pdf из html

You could return o1.length() — o2.length() if pos1 — pos2 == 0 to have the shortest word first if they match like A and AA for example.

I would do something like this:

Put the letters in a HashTable (let’s call it orderMap). Key is the letter, value is the index in ORDER.

Arrays.sort(str, new Comparator() < @Override public int compare(String o1, String o2) < int length = o1.length >o2.length ? o1.length: o2.length for(int i = 0; i < length; ++i) < int firstLetterIndex = orderMap.get(o1.charAt(i)); int secondLetterIndex = orderMap.get(o2.charAt(i)); if(firstLetterIndex == secondLetterIndex) continue; // First string has lower index letter (for example F) and the second has higher index letter (for example B) - that means that the first string comes before if(firstLetterIndex < secondLetterIndex) return 1; else return -1; >return 0; > >); 

For making it case-insensitive just do toUpperCase() to both strings at the beginning.

Here you can find usefull link:

In your example instead comparing specific attributes of class you nedd to check possition of char in benchmarked String and base on this check if it’s greather/equal/smaller.

Took my time to improve on the selected answer. This is more efficient

public static void customSort(final String order,String[] array)< String[] alphabets=; String keyword=order; for(int g=0; g > final String finalKeyword=keyword; Arrays.sort(array, new Comparator() < @Override public int compare(String o1, String o2) < int pos1 = 0; int pos2 = 0; for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) < pos1 = finalKeyword.toUpperCase().indexOf(o1.toUpperCase().charAt(i)); pos2 = finalKeyword.toUpperCase().indexOf(o2.toUpperCase().charAt(i)); >if (pos1 == pos2 && o1.length() != o2.length()) < return o1.length() - o2.length(); >return pos1 - pos2 ; > >); //Arrays.sort(array, Collections.reverseOrder()); > 

Linked

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.27.43548

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Сортировка списка строк в Java

В этом посте мы обсудим, как отсортировать список строк в лексикографическом порядке в Java.

1. Использование Collections.sort() метод

Простое решение для на месте отсортировать список строк в лексикографическом порядке с помощью Collections.sort() метод. Он принимает изменяемый список, размер которого не обязательно должен изменяться.

результат:

[Amazon, Apple, Facebook, Google, Netflix]

The Collections.sort() метод необязательно принимает компаратор, чтобы обеспечить точный контроль над порядком сортировки. Чтобы сделать сравнение между двумя строками нечувствительными к регистру, вы можете использовать String.CASE_INSENSITIVE_ORDER comparator.

результат:

[Amazon, APPLE, Facebook, GOOGLE, Netflix]

2. Использование List.sort() метод

Другой альтернативой сортировке списка строк на месте является метод List.sort() метод, добавленный в спецификацию JDK 1.8. Collections.sort() метод представляет собой оболочку над List.sort() метод. Следовательно, приведенный выше код эквивалентен:

результат:

[Amazon, Apple, Facebook, Google, Netflix]

Вы можете использовать String.CASE_INSENSITIVE_ORDER компаратор, чтобы операция сортировки сравнивала строки, игнорируя их порядок.

результат:

[Amazon, APPLE, Facebook, GOOGLE, Netflix]

3. Использование Stream.sorted() метод

Чтобы создать отсортированную копию списка, вы можете использовать Java 8 Stream. Идея состоит в том, чтобы создать последовательный поток по элементам в списке, отсортировать поток с помощью sorted() и соберите все отсортированные элементы в новый список. Это показано ниже:

Источник

Сортировка массива в Java

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

1. Сортировка массива с помощью Arrays.sort() метод

Arrays class предоставляет несколько статических методов для сортировки массивов:

Он сортирует указанный массив типов примитивов или объектов в порядке возрастания в соответствии с естественным порядком его элементов.

У него также есть версия, которая сортирует указанный массив между указанным диапазоном:

Arrays.sort() использует Dual-Pivot Quicksort, который предлагает O(n.log(n)) производительность. Обычно это быстрее, чем традиционный (одноповоротный) Быстрая сортировка реализации.

Он сортирует указанный массив объектов в соответствии с порядком, заданным указанным компаратором. Он требует, чтобы все элементы массива были взаимно сравнимы указанным компаратором, т. е. для любой пары элементов (e1, e2) в массиве, c.compare(e1, e2) не следует бросать ClassCastException .

⮚ Чтобы отсортировать по возрастанию:

⮚ Чтобы отсортировать по убыванию:

Arrays . sort ( arr , Comparator . reverseOrder ( ) ) ; // или используйте `Collections.reverseOrder()`)

Мы также можем написать собственный компаратор, как показано ниже:

Он также предоставляет версию, которая сортирует указанный массив объектов между указанным диапазоном в соответствии с порядком, заданным указанным компаратором:

Результатом такой сортировки является стабильная сортировка, т. е. будет поддерживаться относительный порядок равных элементов. Он использует итеративный Сортировка слиянием что требует гораздо меньше, чем n.log(n) сравнения, когда входной массив частично отсортирован, в противном случае предлагается производительность традиционной сортировки слиянием, когда входной массив упорядочен случайным образом.

2. Сортировка массива с помощью Arrays.parallelSort() метод

Java 8 также предоставляет Arrays.parallelSort() который использует несколько потоков для сортировки, в отличие от Arrays.sort() который использует только один поток для сортировки элементов. Прототип parallelSort() похоже на sort() .

Это бьет Arrays.sort() когда общее количество элементов превышает определенный порог. Внутри любой массив размером меньше порогового значения сортируется с помощью Arrays.sort() . Порог рассчитывается с учетом параллелизма машины и размера массива. Общий пул ForkJoin используется для выполнения любых параллельных задач.

Следующая программа на Java сравнивает производительность Arrays.parallelSort() с Arrays.sort() на огромном наборе данных из 10 миллионов целых чисел:

Источник

Оцените статью