为什么我的sorting循环似乎追加一个不应该的元素?

我正在尝试使用compareTo()对string数组进行sorting。 这是我的代码:

 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 

我怎样才能调整我的代码来正确地sortingstring数组?

您的输出是正确的。 在开头指明“你好”和“这个”的白色字符。

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

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

输出:

  Hello This Example Is Sorting 

这里数组的第三个元素“is”应该是“Is”,否则它会在sorting后进入最后。 因为sort方法在内部使用ASCII值对元素进行sorting。

除了在这里发布的替代解决scheme(这是正确的)之外,没有人真正通过解决你的代码出了什么问题来回答你的问题。

看起来好像你正试图实现一个selectsortingalgorithm。 我不会详细介绍如何在这里进行sorting,但我已经包含了几个链接供您参考=)

你的代码在语法上是正确的,但在逻辑上是错误的。 你只是通过比较每个string和后面的string来对string进行部分分类。 这是一个正确的版本(我保留了很多原始代码来说明什么是错误的):

 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) 。 简而言之,随着arrays尺寸的增大(逼近无穷大),它变得非常缓慢。 您可能想要阅读更好的方法来sorting数据 ,如快速sorting 。

而不是这条线

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

使用这一行

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

你很好走。 其他用户已经解释了您当前的代码不能正常工作的原因。 上述replace是您可以应用的几个解决方法之一。

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

删除空格可以通过使用trim()函数来完成。 之后,如果要以区分大小写的方式对数组进行sorting,则可以使用:

 Arrays.sort(yourArray); 

并以不区分大小写的方式:

 Arrays.sort(yourArray,String.CASE_INSENSITIVE_ORDER); 

希望这可以帮助!

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会在之前。

如果您想在比较过程中忽略尾随空格 ,可以使用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] } 

参见

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

首先你在" Hello "" This "提供了空格,空格的值比Unicode中的字母字符要小,所以首先打印出来。 (其余的字符按字母顺序sorting)。

现在大写字母的值比Unicode中的小写字母小,所以打印出“Example”和“Sorting”,最后"is " ,其值最高。

如果你使用:

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

你会得到:

 Example Hello is Sorting This 

我认为这是你正在寻找的输出。

首先,你的问题是你使用了区分大小写的compareTo()方法。 这意味着大写字母与小写字母分开。 原因是它用Unicode来表示,大写字母的数字小于小写字母的数字。 因此,你应该使用`compareToIgnoreCase()`在前面的文章中也提到过。

这是我如何有效地做到这一点的完整示例方法

在创build比较器的对象之后,可以将它传递给在java.util.Arrays中定义的此版本的sort()。

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

仔细看看超级。 这样可以确保传入的数组与比较器的types相匹配。

这种方式的神奇之处在于,您可以轻松地按逆序排列string数组,方法很简单:

 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) 

另类select

方法compareToIgnoreCase()虽然在很多场合下都可以正常工作(就像比较英文string一样),但它不会适用于所有的语言和位置 。 这自动使它不适合使用的select。 为了确保它将在任何地方被支持,你应该使用java.text.Collat​​or中的 compare()

您可以通过调用方法getInstance()来find您的位置的一个collat​​or。 之后,你应该设置这个Collat​​or的力量属性。 这可以使用setStrength()方法和Collator.PRIMARY作为参数一起完成。 有了这个替代select, 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); } }