为什么我的排序循环似乎附加了一个不应该的元素?

Sik*_*der 70 java arrays sorting

我正在尝试使用字符串排序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]);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在的输出是:

Hello  This Example Sorting is
Run Code Online (Sandbox Code Playgroud)

我得到的结果,但不是我想要得到的结果,它们是:

Hello This Example Is Sorting
Run Code Online (Sandbox Code Playgroud)

如何调整我的代码以正确排序字符串数组?

Juv*_*nis 145

你的输出是正确的.在开头表示"Hello"和"This"的白色字符.

另一个问题是您的方法.使用Arrays.sort()方法:

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

输出:

 Hello
 This
Example
Is
Sorting
Run Code Online (Sandbox Code Playgroud)

这里数组"is"的第三个元素应该是"Is",否则它将在排序后进入最后.因为sort方法在内部使用ASCII值来排序元素.

  • @Alex请阅读有关在Java中实现Comparable接口的信息. (2认同)

小智 15

除了这里发布的替代解决方案(这是正确的)之外,没有人通过解决您的代码错误来回答您的问题.

好像你试图实现一个选择排序算法.我不会详细介绍排序的工作原理,但我已经包含了一些链接供您参考=)

你的代码在语法上是正确的,但在逻辑上是错误的.您只是通过将每个字符串与其后面的字符串进行比较来对字符串进行部分排序.这是一个更正的版本(我保留了原始代码,以说明它的"错误"):

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;
     }
 }
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读

这种方法的问题在于其渐近复杂度为O(n ^ 2).简而言之,随着阵列大小的增加(接近无穷大),它变得非常慢.您可能希望了解更好的数据排序方法,例如quicksort.


小智 9

而不是这条线

if(Array[i].compareTo(Array[j])<0)
Run Code Online (Sandbox Code Playgroud)

使用这一行

if(Array[i].trim().compareTo(Array[j].trim())<0)
Run Code Online (Sandbox Code Playgroud)

你很高兴.其他用户已经解释了当前代码无法正常工作的原因.以上替换是您可以应用的几种解决方法之一.


小智 9

我知道这是一个迟到的回复,但也许它可以帮助某人.

可以使用trim()函数删除空格.之后,如果您想以区分大小写的方式对数组进行排序,您可以使用:

Arrays.sort(yourArray);
Run Code Online (Sandbox Code Playgroud)

并且对于不区分大小写的方式:

Arrays.sort(yourArray,String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


ROM*_*eer 5

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]
}
Run Code Online (Sandbox Code Playgroud)

如果要忽略大小写,可以使用:

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]
}
Run Code Online (Sandbox Code Playgroud)

否则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]
}
Run Code Online (Sandbox Code Playgroud)

: