Как я могу правильно отсортировать строку, введенную пользователем, в алфавитном порядке. Верна ли моя логика в приведенном ниже коде? Вывод неверен, и последнее напечатанное имя всегда неверно.
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;
}
}
Как я могу правильно отсортировать строку, введенную пользователем, в алфавитном порядке. Верна ли моя логика в приведенном ниже коде? Вывод неверен, и последнее напечатанное имя всегда неверно. Будет ли использование списка массивов более оптимальным?
Хорошо, после дальнейшего рассмотрения проблема заключается в том, как я разбиваю строку на массив перед сортировкой. В зависимости от того, как я использую метод разделения ( userInput.split(",") или userInput.split("[, ]"); влияет на то, печатается ли он в алфавитном порядке или нет, но теперь проблема в том, что я использую разделение с запятыми и пробелы. Я не могу вводить полные имена пользователей, потому что они разделяются по пробелам. Но без них сортировка не выполняется правильно и работает только в том случае, если пользователь вводит правильно, используя запятую после каждого имени и без дополнительных пробелов.
userInput.split(",\\s*"); — запятая, за которой следует любое количество пробелов, даже ноль.
Если я разделю пробел, то столкнусь с проблемой невозможности ввода имени и фамилии вместе, но я не смогу правильно отсортировать их без разделения пробелами.
Я рекомендую разделить то, что не является словом: userInput.split("\\W+") т.е. разделить на один или несколько символов, не являющихся словами.
Использование userInput.split("\\W+") не позволяет мне вводить имя и фамилию, поскольку оно разделяет полное имя. что я могу сделать, чтобы получить полное имя, но не столкнуться с проблемами, если пользователь добавляет дополнительные пробелы перед запятой, чтобы отделить каждое введенное имя. это почему-то нарушает алфавитный порядок
userInputArray = userInput.split("\\s*,\\s*");@MustafaErdogan Я почти уверен, что ты прокомментировал мой предыдущий комментарий, не так ли?




Ну... Я думаю, вам стоит предоставить входной образец.
Может быть, есть пробелы или что-то в этом роде.
Добавьте это после разделения.
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( );
Неправильно в каком смысле?