Han*_*ror -3 java arrays sorting string collections
允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为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)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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<String> stringList = new ArrayList<String> (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<String> stringList = new ArrayList<String> (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<String> stringList = new ArrayList<String>(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<String> stringList = new ArrayList<String> (Arrays.asList(strArray));
Collections.sort(stringList);
strArray = stringList.toArray(strArray);*/
/*for (String s: strArray) {
if (!(s == null)){
Arrays.sort(strArray);
}
}*/
List<String> stringList = new ArrayList<String>(Arrays.asList(strArray));
Collections.sort(stringList);
strArray = stringList.toArray(strArray);
//Arrays.sort(strArray);
}
}
Run Code Online (Sandbox Code Playgroud)
您获得NullPointerExceptions 的原因可以通过javadocArrays#sort()解释(强调我的):
根据元素的自然顺序,将指定的对象数组按升序排序.数组中的所有元素都必须实现
Comparable接口.
因为Arrays.sort()期望Comparable元素而不是null值,所以最终会NullPointerException在方法尝试调用时结束compareTo().
修复 - 现在解决这个问题的方法是简单地确保null数组中的所有元素都被替换为非元素null,例如"".因此,在创建时以及删除a String并将null元素设置为之后循环遍历数组"".但是,这个解决方案可能不会对您的代码执行得太好,因为它在每次String删除后都需要另一个循环,这可能会变得繁重.由于String池的魔力,至少它不需要你创建一堆对象,因此它比你对不同对象的处理要好一些.
更好的解决方案是简单地使用ArrayList<String>而不是原始数组; 毕竟,你已经在使用一个管理addString()和removeString(),所以你将会减少从数组转换ArrayList和回做.此外,排序时不需要担心NPE(至少对于您的用例; 在排序时添加null到Collection仍然会导致NPE).
你也可以只使用一个原始数组,但管理它会有点讨厌,所以我不建议这样做.如果你做得对,你不必担心NPE.