在Java中对字符串数组进行排序

允许用户使用字符串数组。 他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序。 分类是搞砸我的原因。 我尝试过几种不同的方法。 第一种方法是将数组转换为ArrayList并使用Collections对ArrayList进行排序,ArrayList将被转换回静态类数组。 它不起作用。 我尝试的第二种方法是遍历数组并尝试仅排序用户添加的字符串而不是数组中的所有内容(因为数组中有一些空值)。 也许我应该遍历数组,然后将非null值存储到一个新的数组中,然后我可以对它进行排序? 但是如果我想在排序新数组后添加更多字符串呢? 这就是为什么我停止了第二个解决方案。 第三次尝试是在我的数组上使用Arrays.sort()但由于某种原因它不起作用。

这是例外:

Exception in thread "main" java.lang.NullPointerException at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290) at java.util.ComparableTimSort.sort(ComparableTimSort.java:157) at java.util.ComparableTimSort.sort(ComparableTimSort.java:146) at java.util.Arrays.sort(Arrays.java:472) at java.util.Collections.sort(Collections.java:155) at testingSearch.sortArray(testingSearch.java:93) at testingSearch.main(testingSearch.java:42) 

这是我的代码:

 import java.util.Scanner; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class testingSearch { static String[] strArray; static { strArray = new String[5]; } public static void main(String[] args) { Scanner input = new Scanner(System.in); while(true){ System.out.println("1. Add string to the string array."); System.out.println("2. Remove string from the string array."); System.out.println("3. Display strings in string array."); System.out.println("4. Search the string array for a string."); System.out.println("5. Sort the strings in the string array."); int userChoice = 0; userChoice = input.nextInt(); switch(userChoice) { case 1: addString(); break; case 2: removeString(); break; case 3: displayStrings(); break; case 4: searchArray(); break; case 5: sortArray(); break; } } } public static void addString(){ Scanner input = new Scanner(System.in); System.out.println("What string do you want to add?"); String userInput; userInput = input.nextLine(); ArrayList stringList = new ArrayList (Arrays.asList(strArray)); stringList.add(userInput); strArray = stringList.toArray(strArray); } public static void removeString(){ Scanner input = new Scanner(System.in); System.out.println("What string do you want to remove?"); String userInput; userInput = input.nextLine(); ArrayList stringList = new ArrayList (Arrays.asList(strArray)); stringList.remove(userInput); strArray = stringList.toArray(strArray); } public static void displayStrings(){ for (String s: strArray){ if (!(s == null)){ System.out.println(s); } } } public static void searchArray(){ Scanner input = new Scanner(System.in); System.out.println("What string do you want to search the array for?"); String userInput; userInput = input.nextLine(); ArrayList stringList = new ArrayList(Arrays.asList(strArray)); if (stringList.contains(userInput)){ System.out.println("The string array contains that string!"); } else { System.out.println("The string array does not contain that string..."); } } public static void sortArray(){ /*ArrayList stringList = new ArrayList (Arrays.asList(strArray)); Collections.sort(stringList); strArray = stringList.toArray(strArray);*/ /*for (String s: strArray) { if (!(s == null)){ Arrays.sort(strArray); } }*/ List stringList = new ArrayList(Arrays.asList(strArray)); Collections.sort(stringList); strArray = stringList.toArray(strArray); //Arrays.sort(strArray); } } 

你得到NullPointerException的原因可以通过javadoc for Arrays#sort()解释#sort Arrays#sort() (强调我的):

根据元素的自然顺序,将指定的对象数组按升序排序。 数组中的所有元素都必须实现Comparable接口。

因为Arrays.sort()需要Comparable元素而不是null值,所以当方法尝试调用compareTo()时,最终会出现NullPointerException

修复 – 现在解决这个问题的方法是简单地确保数组中的所有null元素都替换为非null元素,例如"" 。 因此,在创建时和删除String后循环遍历数组并将null元素设置为"" 。 但是,这个解决方案可能不会对您的代码执行得太好,因为它需要在每个String被删除后再循环,这可能会变得繁重。 由于String池的神奇之处,至少它不需要你创建一堆对象,因此它比你对不同对象的处理要好一些。

更好的解决方案是简单地使用ArrayList而不是原始数组; 毕竟,你已经在使用一个来管理addString()removeString() ,所以你可以减少从数组到ArrayList转换,然后再做回来。 此外,排序时不需要担心NPE(至少对于您的用例;在Collection添加null仍会在排序时导致NPE)。

你也可以只使用一个原始数组,但管理它会有点烦人,所以我不建议这样做。 如果你做得对,你不必担心NPE。

没问题! 干得好:

  1. Create a new array 2. Insert items to that array, in the right order 

公共类分拣机{

 public static void main(String[] args){ String[] array = new String[]{"HI", "BYE", null, "SUP", ":)"}; //Sort: String[] newArray = new String[array.length]; int index = 0; for(int m = 0 ; m < newArray.length; m++){ String leastString = null; int i = 0; for(i = 0; i < array.length; i++){ if(leastString==null&&array[i]!=null){ leastString = array[i]; break; } } for(int j = i+1; j < newArray.length; j++){ if(array[j]!=null){ if(array[j].compareTo(array[i])<0){ leastString = array[j]; i = j; } } } if(i==newArray.length)break; newArray[m] = leastString; array[i] = null; } for(String s : newArray){ System.out.println(s); } } 

}

这打印:

 :) BYE HI SUP null 

编辑:另一种非常简单的方法,以非常有效的方式解决这个问题,是使用ArrayList:

 public class AClass { public static void main(String[] args){ String[] array = new String[]{"HI", "BYE", null, "SUP", ":)"}; //Sort: ArrayList newArray = new ArrayList(); for(String s : array){ if(s!=null){ newArray.add(s); } } Collections.sort(newArray); String[] retval = new String[newArray.size()]; retval = newArray.toArray(retval); for(String s : retval){ System.out.println(s); } 

}}

我想简单的做事方式是:

 static String[] strArray; static { strArray = new String[5]; for(int i = 0, i < strArray.length; i++) { strArray[i] = ""; } } 

然后打电话

 Arrays.sort(strArray); 

当你想要排序它。 如果这不起作用,虽然我认为应该; 您最初的方法如下:

  List stringList = new ArrayList(); for(int i = 0; i < strArray.length; i++) { stringList.add(strArray[i]); } Collections.sort(stringList); strArray = stringList.toArray(new String[stringList.size()]); 

虽然它显然看起来不太友好。