#java #arrays #algorithm #sorting #alphabetical-sort
#java #массивы #алгоритм #сортировка #сортировка по алфавиту
Вопрос:
Вот мой Java-код. (Объяснение в конце)
import java.util.Scanner;
import java.util.Arrays;
/**
*
* @author Laksh
*/
public class Sort4 {
public static void Swap(int[] array,int Swap1,int Swap2){
int temporarySwapper;
temporarySwapper=array[Swap1];
array[Swap1]=array[Swap2];
array[Swap2]=temporarySwapper;
}
public static void Swap(String[] array,int Swap1,int Swap2){
String temporarySwapper;
temporarySwapper=array[Swap1];
array[Swap1]=array[Swap2];
array[Swap2]=temporarySwapper;
}
public static String[] alphasort(String[] original, int level, int start, int end ){
int swaps;
int[] array=new int[original.length];
for(int i=0;i<original.length;i ){
array[i]=(int)original[i].charAt(level);
}
do{
swaps=0;
for(int i=start;i<end;i ){
if(array[i]>array[i 1]){
Swap(original,i,i 1);
Swap(array,i,i 1);
swaps ;
}
}
}while(swaps != 0);
return Arrays.copyOfRange(original, start, end 1);
}
public static String repeat(String s,int times){
String returnString="";
for(int i=0;i<times;i ){
returnString =s;
}
return returnString;
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("Enter 5 Names:");
int max=Integer.MIN_VALUE;
String[] name=new String[5];
for(int i=0;i<5;i ){
name[i]=input.next();
if(name[i].length()>max){
max=name[i].length();
}
}
for(int i=0;i<5;i ){
if(name[i].length()<max){
name[i]=name[i] repeat(" ",max-name[i].length());
}
}
String[] sorted=alphasort(name,0,0,name.length-1);
for(String c:sorted){
System.out.println(c);
}
}
}
Чтобы прояснить проблемы, с которыми я сталкиваюсь, мой код основан на поиске целого значения ascii для символа char, а затем сортировке массива целых чисел. Если первая буква строки, которую я пытаюсь ввести, равна первой из другой, код переходит ко второй букве и так далее. Чтобы избежать выхода индекса строки за пределы, я использовал метод «repeat» для добавления достаточного количества пробелов в конец каждой строки, чтобы все они были одинаковой длины — поскольку строки одинаковой длины предотвратили бы это. Проблема, с которой я сталкиваюсь, заключается в том, что сортировка выполняется правильно, но в некоторых местах происходит сбой.
например, если я передаю «butter» и «butterfly», они выводятся в порядке их ввода по отношению к другим значениям, которые отсортированы должным образом! Например:
butter
cookie
butterfly
cookiemonster
ninja
сортирует в
butter
butterfly
cookie
cookiemonster
ninja
принимая во внимание
butterfly
cookie
butter
cookiemonster
ninja
сортирует в
butterfly
butter
cookie
cookiemonster
ninja
Помогите мне, поскольку я не могу найти свою ошибку.
Комментарии:
1. Ошибки нет. Опубликованный вами вывод показывает, что оба входных сигнала правильно отсортированы в одном и том же выводе, причем butter идет перед butterfly.
2. можете ли вы немного подробнее объяснить, что не так с выводом (отсортированным списком)?
3. О, прошу прощения. Я неправильно вставил выходные данные. Он был отредактирован, так что теперь вы можете увидеть проблему со 2-м выводом (1-й был фактически правильным)
4. Почему вы не используете
TreeSet<String>()
илиRadixSort
илиArrays.sort(original)
?5. Я думаю, это какая-то домашняя работа или практика?
Ответ №1:
Вы сравнивали только первые буквы каждого слова, и порядок слов butterfly и butter не изменился.
Вы должны сравнить каждую букву каждого слова с функцией, приведенной ниже:
int size = myArray.length;
for(int i = 0; i<size-1; i ) {
for (int j = i 1; j<myArray.length; j ) {
if(myArray[i].compareTo(myArray[j])>0) {
String temp = myArray[i];
myArray[i] = myArray[j];
myArray[j] = temp;
}
}