为什么我的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.Collator中的 compare()
。
您可以通过调用方法getInstance()
来find您的位置的一个collator。 之后,你应该设置这个Collator的力量属性。 这可以使用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); } }