Java сортировка по желаемой строке - PullRequest
2 голосов
/ 19 сентября 2019

Я новичок в идее компараторов и ищу способы сортировки строк.В моем коде ниже я составил список и отсортировал его по методу Collections.sort().Вот код:

public class ComparatorTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        List<String> list = new ArrayList<String>();
        list.addAll(Arrays.asList("Bob Stone", "Jordan Brand", "Bob Mass", "Dylan Walsh","Tom Mavis","Bob Ganley"));
        System.out.println("Before sort "+ list);
        Collections.sort(list);
        System.out.println("After sort "+ list);
    }



}

Как я могу изменить эту сортировку, используя сортировку по заданной строке вместо простой сортировки по алфавиту?Например, если я дам строку BOB, тогда все BOB будут перемещены в начало списка.Я задавал вопрос сортировки раньше, но я неправильно понял идею сортировки, и это был скорее вопрос фильтрации ( список сортировки java строк по значению строки, введенный пользователем ).Этот вопрос отличается от моего предыдущего вопроса, поскольку теперь я пытаюсь на самом деле отсортировать и перегруппировать строки вместо их фильтрации.

Ответы [ 3 ]

5 голосов
/ 19 сентября 2019

Вы можете использовать метод Boolean.compare, чтобы проверить, начинаются ли строки с "Bob":

Comparator<String> bobsFirst = (a, b) -> Boolean.compare(b.startsWith("Bob"), a.startsWith("Bob"));

Сравнение их таким образом (сначала b, затем a) помещает вещи, начинающиеся с "Bob"сначала.

Затем перерыв связи с использованием естественного порядка:

Comparator<String> comparator = bobsFirst.thenComparing(a -> a);

Обратите внимание, что startsWith чувствителен к регистру.Чтобы игнорировать регистр «Боб», вы можете заменить b.startsWith("Bob") (аналогично a) на:

 b.regionMatches(true, 0, "Bob", 0, 3)
3 голосов
/ 19 сентября 2019

Collator класс

Правила, используемые при сравнении и сортировке естественного языка (человеческого языка), формально называются сопоставлением .

В Java правила любого сопоставления определены в классе, реализующем класс Collator.Обычно его подкласс RulesBasedCollator используется для сравнения / сортировки.Класс CollatorProvider является SPI (интерфейс поставщика услуг) для предоставления зарегистрированной реализации Collator.В последних версиях Java по умолчанию используются определения параметров сортировки, предоставляемые консорциумом Unicode в их общем хранилище данных локали (CLDR) .

Предположительно, выВы можете создать собственную реализацию Collator с такими особыми правилами, какие пожелаете.

Имейте в виду, что сопоставление - это очень сложная область, правила которой широко варьируются в зависимости от человеческого языка и культурных норм.Если вас интересует только американский английский, у вас может быть несколько проблем.Но если вы имеете дело с другими языками, культурами или альтернативными персонажами, такими как © или эмодзи, ну, здесь будут драконы .

2 голосов
/ 19 сентября 2019

Первое, что вам нужно сделать, это понять правила, например, что происходит, когда:

  • И левая, и правая стороны начинаются с "Боб"?
  • Что происходит, когда ни левая, ни правая стороны не начинаются с "Боб"?
  • Вы хотите сопоставить регистр?
  • Вы заботитесь только об именах или должнывключили фамилию или вы хотите, чтобы ее можно было настраивать?

Простая реализация может выглядеть примерно так ...

public class NameComparator implements Comparator<String> {

    private String name;

    public NameComparator(String name) {
        this.name = name;
    }

    @Override
    public int compare(String lhs, String rhs) {
        if (lhs.startsWith(name) && rhs.startsWith(name)) {
            return lhs.compareTo(rhs);
        } else if (lhs.startsWith(name)) {
            return -1;
        } else if (lhs.startsWith(name)) {
            return 1;
        }

        return lhs.compareTo(rhs);
    }
}

Теперь это соответствует регистру (так что bob не то же самое, что Bob) и подразделяет всех «Бобов» в своей собственной группе

Как видите, пять секунд размышлений привели к появлению множества возможных способов сортировкисписок, так что вам нужно знать о ваших опциях, какие из них вы можете настроить и какие вы хотите исправить.

Вы можете назвать этот пример, используя что-то вроде ...

Collections.sort(list, new NameComparator("Bob"));

Что будет, исходя из ваших доступных яnput, output ...

Before sort [Bob Stone, Jordan Brand, Bob Mass, Dylan Walsh, Tom Mavis, Bob Ganley]
After sort [Bob Ganley, Bob Mass, Bob Stone, Dylan Walsh, Jordan Brand, Tom Mavis]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...