Почему мой цикл сортировки добавляет элемент там, где он не должен?

Я пытаюсь отсортировать массив строк, используяcompareTo(), Это мой код:

static String Array[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
String temp;

public static void main(String[] args)
{

   for (int j=0; j<Array.length;j++)
   {
       for (int i=j+1 ; i<Array.length; i++)
       {
           if (Array[i].compareTo(Array[j])<0)
           {
               String temp = Array[j];
               Array[j] = Array[i];
               Array[i] = temp;
           }
       }
       System.out.print(Array[j]);
   }
}

Теперь вывод:

Hello  This Example Sorting is

Я получаю результаты, но не те результаты, которые хочу получить, а именно:

Hello This Example Is Sorting

Как я могу настроить свой код для правильной сортировки массива строк?

 user23803321 окт. 2012 г., 00:31
Небольшой совет, который я могу дать вам, когда программирование не противоречит соглашению. Если вы ошибаетесь в одном, делайте это неправильно везде, вместо того, чтобы делать это правильно в некоторых местах и неправильно в других местах.
 Sikander20 окт. 2012 г., 11:36
да я буду, заразить я новичок в Java. и был полностью застрял с ним, понятия не имел о таких незначительных проблемах ..
 user23803320 окт. 2012 г., 10:03
Вы должны действительно работать над своим соглашением кода.

Ответы на вопрос(8)

" Hello " , " This " , "is ", "Sorting ", "Example"

Прежде всего, вы предоставили места в" Hello " а также" This ", пробелы имеют меньшее значение, чем буквенные символы в Юникоде, поэтому он печатается первым. (Остальные символы были отсортированы в алфавитном порядке).

Теперь заглавные буквы имеют меньшее значение, чем строчные буквы в Юникоде, поэтому выводятся «Пример» и «Сортировка», а затем"is " который имеет наибольшее значение.

Удаление пробелов можно сделать с помощью функции trim (). После этого, если вы хотите отсортировать массив с учетом регистра, вы можете просто использовать:

Arrays.sort(yourArray);

и без учета регистра:

Arrays.sort(yourArray,String.CASE_INSENSITIVE_ORDER);

Надеюсь это поможет!

ваша проблема в том, что вы используете метод `compareTo (), который чувствителен к регистру. Это означает, что заглавные буквы сортируются отдельно от строчных. Причина в том, что он переведен в Unicode, где заглавные буквы представлены числами, которые меньше представленного числа в нижнем регистре. Таким образом, вы должны использовать `compareToIgnoreCase ()`, как и многие другие, упомянутые в предыдущих постах.

Это мой полный пример того, как вы можете сделать это эффективно

После создания объектакомпаратор вы можете передать его в этой версии `sort ()`, которая определена вjava.util.Arrays.

static<T>void sort(T[]array,Comparator<?super T>comp)

внимательно посмотреть насупер. Это гарантирует, что переданный массив совместим с типом компаратора.

Волшебная часть этого пути заключается в том, что вы можете легко отсортировать массив строк вОбратный порядок Вы можете легко сделать это:

return strB.compareToIgnoreCase(strA);

import java.util.Comparator;

    public class IgnoreCaseComp implements Comparator<String> {

        @Override
        public int compare(String strA, String strB) {
            return strA.compareToIgnoreCase(strB);
        }

    }

  import java.util.Arrays;

    public class IgnoreCaseSort {

        public static void main(String[] args) {
            String strs[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
            System.out.print("Initial order: ");

            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");

            IgnoreCaseComp icc = new IgnoreCaseComp();

            Arrays.sort(strs, icc);

            System.out.print("Case-insesitive sorted order:  ");
            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");

            Arrays.sort(strs);

            System.out.print("Default, case-sensitive sorted order: ");
            for (String s : strs) {
                System.out.print(s + " ");
            }

            System.out.println("\n");
        }

    }

 run:
    Initial order:  Hello   This  is  Sorting  Example 

    Case-insesitive sorted order:   Hello   This  Example is  Sorting  

    Default, case-sensitive sorted order:  Hello   This  Example Sorting  is  

    BUILD SUCCESSFUL (total time: 0 seconds)
Альтернативный выбор

МетодcompareToIgnoreCase(), хотя он хорошо работает во многих случаях (так же, как сравнивать строки на английском языке), он не будет работать хорошо со всемиязыки и локации, Это автоматически делает его непригодным для использования. Чтобы убедиться, что он будет поддерживаться везде, где вы должны использоватьcompare() изjava.text.Collator.

Вы можете найти сортировщик для вашего местоположения, вызвав методgetInstance(), После этого вы должны установить свойство прочности этого Collator. Это можно сделать с помощьюsetStrength() метод вместе сCollator.PRIMARY в качестве параметра. С помощью этой альтернативы выберитеIgnocaseComp можно написать так же, как показано ниже. Эта версия кода будет генерировать один и тот же вывод независимо от местоположения

import java.text.Collator;
import java.util.Comparator;

//this comparator uses one Collator to determine 
//the right sort usage with no sensitive type 
//of the 2 given strings
public class IgnoreCaseComp implements Comparator<String> {

    Collator col;

    IgnoreCaseComp() {
        //default locale
        col = Collator.getInstance();

        //this will consider only PRIMARY difference ("a" vs "b")
        col.setStrength(Collator.PRIMARY);
    }

    @Override
    public int compare(String strA, String strB) {
        return col.compare(strA, strB);
    }

}

Если вы используете:

if (Array[i].compareToIgnoreCase(Array[j]) < 0)

ты получишь:

Example  Hello  is  Sorting  This

который я думаю, является результатом, который вы искали.

 BSMP12 янв. 2017 г., 21:26
который я думаю, это результат, который вы искали - Не в соответствии с редактированием, которое произошло вчера.

которые были размещены здесь (которые являются правильными), никто на самом деле не ответил на ваш вопрос, решив, что не так с вашим кодом.

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

Ваш код был синтаксически правильным, но логически неверным. Вы частично сортировали свои строкисравнивая только каждую строку со строками после нее, Вот исправленная версия (я сохранил столько же вашего исходного кода, чтобы проиллюстрировать, что с ним «не так»):

static  String Array[]={" Hello " , " This " , "is ", "Sorting ", "Example"};
String  temp;

//Keeps track of the smallest string's index
int  shortestStringIndex; 

public static void main(String[] args)  
{              

 //I reduced the upper bound from Array.length to (Array.length - 1)
 for(int j=0; j < Array.length - 1;j++)
 {
     shortestStringIndex = j;

     for (int i=j+1 ; i<Array.length; i++)
     {
         //We keep track of the index to the smallest string
         if(Array[i].trim().compareTo(Array[shortestStringIndex].trim())<0)
         {
             shortestStringIndex = i;  
         }
     }
     //We only swap with the smallest string
     if(shortestStringIndex != j)
     {
         String temp = Array[j];
         Array[j] = Array[shortestStringIndex]; 
         Array[shortestStringIndex] = temp;
     }
 }
}

Дальнейшее чтение

Проблема с этим подходом состоит в том, что егоасимптотическая сложностьO (N ^ 2), Проще говоря, он становится очень медленным с ростом размера массива (приближается к бесконечности). Вы можете прочитать олучшие способы сортировки данных, такие какбыстрая сортировка.

Вместо этой строки

if(Array[i].compareTo(Array[j])<0)

используйте эту строку

if(Array[i].trim().compareTo(Array[j].trim())<0)

и ты в порядке. Причина, по которой ваш текущий код не работает, уже объяснена другими пользователями. Эта замена является одним из обходных путей, которые вы можете применить.

Java 8Вы также можете использоватьparallelSort что полезно, если у вас есть массивы, содержащие много элементов.

Пример:

public static void main(String[] args) {
    String[] strings = { "x", "a", "c", "b", "y" };
    Arrays.parallelSort(strings);
    System.out.println(Arrays.toString(strings));   // [a, b, c, x, y]
}

Если хочешьигнорировать дело, вы можете использовать:

public static void main(String[] args) {
    String[] strings = { "x", "a", "c", "B", "y" };
    Arrays.parallelSort(strings, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {              
            return o1.compareToIgnoreCase(o2);
        }
    });
    System.out.println(Arrays.toString(strings));   // [a, B, c, x, y]
}

в противном случаеB будет раньшеa.

Если хочешьигнорировать завершающие пробелы во время сравнения вы можете использоватьtrim():

public static void main(String[] args) {
    String[] strings = { "x", "  a", "c ", " b", "y" };
    Arrays.parallelSort(strings, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {              
            return o1.trim().compareTo(o2.trim());
        }
    });
    System.out.println(Arrays.toString(strings)); // [  a,  b, c , x, y]
}

Видеть:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.htmlРазница между Arrays.sort () и Arrays.parallelSort ()http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java?av=f
Решение Вопроса

ле.

Другая проблема связана с вашей методологией. ИспользоватьArrays.sort() метод:

String[] strings = { " Hello ", " This ", "Is ", "Sorting ", "Example" };
Arrays.sort(strings);

Выход:

 Hello
 This
Example
Is
Sorting

Здесь третий элемент массива «is» должен быть «Is», иначе он будет последним после сортировки. Потому что метод sort внутренне использует значение ASCII для сортировки элементов.

 Juvanis19 февр. 2016 г., 22:17
@ Алекс, пожалуйста, прочитайте о реализации Comparable интерфейса в Java.
 Alex18 февр. 2016 г., 07:17
Что делать, если у меня есть класс с двумя полями: 1)text 2)code, а потом я создалarraylist, и я хочу отсортироватьarraylist элементы относительноtext?

Ваш ответ на вопрос