Алфавитная сортировка не печатается правильно в Java

Как я могу правильно отсортировать строку, введенную пользователем, в алфавитном порядке. Верна ли моя логика в приведенном ниже коде? Вывод неверен, и последнее напечатанное имя всегда неверно.

import java.util.Arrays;
import java.util.Scanner;

public class SortNames {

    public static void main(String[] args) {
        System.out.println("Please enter a list of names delimited by commas: ");
        Scanner userInputScanner = new Scanner(System.in);
        String userInput = userInputScanner.nextLine();
        String userInputArray[]=null;
        userInputArray= userInput.split(",");
        
        String ListOrdered[]=DisplayListOrdered(userInputArray);
        //System.out.print(Arrays.toString(ListOrdered));
         for (String name : ListOrdered) {
                System.out.println(name);
            }

    }
    public static String[] DisplayListOrdered(String userInputArray1[])
    {   
    
        Arrays.sort(userInputArray1,String.CASE_INSENSITIVE_ORDER);
        return userInputArray1;
        
    }

}

Как я могу правильно отсортировать строку, введенную пользователем, в алфавитном порядке. Верна ли моя логика в приведенном ниже коде? Вывод неверен, и последнее напечатанное имя всегда неверно. Будет ли использование списка массивов более оптимальным?

Неправильно в каком смысле?

Tim Roberts 22.02.2024 06:43

Хорошо, после дальнейшего рассмотрения проблема заключается в том, как я разбиваю строку на массив перед сортировкой. В зависимости от того, как я использую метод разделения ( userInput.split(",") или userInput.split("[, ]"); влияет на то, печатается ли он в алфавитном порядке или нет, но теперь проблема в том, что я использую разделение с запятыми и пробелы. Я не могу вводить полные имена пользователей, потому что они разделяются по пробелам. Но без них сортировка не выполняется правильно и работает только в том случае, если пользователь вводит правильно, используя запятую после каждого имени и без дополнительных пробелов.

Mustafa Erdogan 22.02.2024 06:58
userInput.split(",\\s*"); — запятая, за которой следует любое количество пробелов, даже ноль.
Dawood ibn Kareem 22.02.2024 07:05

Если я разделю пробел, то столкнусь с проблемой невозможности ввода имени и фамилии вместе, но я не смогу правильно отсортировать их без разделения пробелами.

Mustafa Erdogan 22.02.2024 07:08

Я рекомендую разделить то, что не является словом: userInput.split("\\W+") т.е. разделить на один или несколько символов, не являющихся словами.

Bohemian 22.02.2024 07:08

Использование userInput.split("\\W+") не позволяет мне вводить имя и фамилию, поскольку оно разделяет полное имя. что я могу сделать, чтобы получить полное имя, но не столкнуться с проблемами, если пользователь добавляет дополнительные пробелы перед запятой, чтобы отделить каждое введенное имя. это почему-то нарушает алфавитный порядок

Mustafa Erdogan 22.02.2024 07:14
userInputArray = userInput.split("\\s*,\\s*");
g00se 22.02.2024 10:22

@MustafaErdogan Я почти уверен, что ты прокомментировал мой предыдущий комментарий, не так ли?

g00se 24.02.2024 12:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ну... Я думаю, вам стоит предоставить входной образец.

Может быть, есть пробелы или что-то в этом роде.

Добавьте это после разделения.

for (int i = 0; i < userInputArray.length; i++) {
    // trim to remove leading and trailing 
    userInputArray[i] = userInputArray[i].trim();  
}
Ответ принят как подходящий

Просто разделите и зачистите строки

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

String input = "dog,cat , bird ,     fish";
String[] parts = input.split( "," );
for ( int index = 0 ; index < parts.length ; index++ )
{
    parts[ index ] = parts[ index ].strip( );
}
Arrays.sort( parts );

Будет ли использование списка массивов более оптимальным?

Использование Java Collections Framework, как правило, намного удобнее, чем массивы.

String input = "dog,cat , bird ,     fish";
List < String > parts  = new ArrayList <>( List.of( input.split( "," ) ) );
List < String > strings = new ArrayList <>( parts.size() );
for ( String part : parts )
{
    strings.add( part.strip() );
}
strings.sort( String.CASE_INSENSITIVE_ORDER );  // Beware: This comparator does *not* take locale into account. Use `Collator` instead.

Дамп на консоль.

strings.forEach( System.out :: println );
System.out.println( "strings = " + strings );

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

Кроме того, в Java 21+ теперь есть более общий интерфейс для обозначения отсортированной коллекции: SequencedCollection . См. JEP 431: Последовательные коллекции.

SequencedCollection < String > sortedStrings =
        Arrays
                .stream( 
                    "dog,cat , bird ,     fish"
                    .split( "," ) 
                )
                .map( String :: strip )
                .sorted( )
                .toList( );

Напоминание: имена переменных в Java по соглашению начинаются со строчной буквы. Так что listOrdered, а не ListOrdered.

То же самое касается имен методов: displayListOrdered, а не DisplayListOrdered.

Обрезные детали вы можете получить одной короткой строкой: String[] strings = input.replaceAll("^\\W+", "").split("\\W+");. Или всё целиком: var sorted = Arrays.stream(input.replaceAll("^\\W+", "").split("\\W+")).sorted( ).toList( );

Bohemian 24.02.2024 11:51

Другие вопросы по теме