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

在Java中对字符串数组进行排序,java,arrays,string,sorting,collections,Java,Arrays,String,Sorting,Collections,允许用户播放字符串数组。他们可以向数组中添加字符串,从数组中删除字符串,在数组中搜索字符串,最终可以对数组进行排序。排序把我搞砸了。我试过几种不同的方法。第一种方法是将数组转换为ArrayList,并使用集合对ArrayList进行排序,然后将其转换回静态类数组。它不起作用。我尝试的第二种方法是遍历数组,并尝试仅对用户添加的字符串进行排序,而不是对数组中的所有内容进行排序(因为数组中有一些空值)。也许我应该遍历数组,然后将非空值存储到一个新数组中,然后进行排序?但是,如果我想在对新数组排序后添加

允许用户播放字符串数组。他们可以向数组中添加字符串,从数组中删除字符串,在数组中搜索字符串,最终可以对数组进行排序。排序把我搞砸了。我试过几种不同的方法。第一种方法是将数组转换为ArrayList,并使用集合对ArrayList进行排序,然后将其转换回静态类数组。它不起作用。我尝试的第二种方法是遍历数组,并尝试仅对用户添加的字符串进行排序,而不是对数组中的所有内容进行排序(因为数组中有一些空值)。也许我应该遍历数组,然后将非空值存储到一个新数组中,然后进行排序?但是,如果我想在对新数组排序后添加更多字符串,该怎么办?这就是我停止使用第二种解决方案的原因。第三次尝试是在我的数组上使用array.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<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);

    }

}
import java.util.Scanner;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
公共类测试搜索{
静态字符串[]字符串;
静止的{
strArray=新字符串[5];
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
while(true){
System.out.println(“1.将字符串添加到字符串数组。”);
System.out.println(“2.从字符串数组中删除字符串。”);
System.out.println(“3.在字符串数组中显示字符串。”);
System.out.println(“4.在字符串数组中搜索字符串。”);
System.out.println(“5.对字符串数组中的字符串进行排序。”);
int userChoice=0;
userChoice=input.nextInt();
开关(用户选择){
案例1:
addString();
打破
案例2:
再投资();
打破
案例3:
显示字符串();
打破
案例4:
searchArray();
打破
案例5:
sortArray();
打破
}
}
}
公共静态void addString(){
扫描仪输入=新扫描仪(System.in);
System.out.println(“要添加什么字符串?”);
字符串用户输入;
userInput=input.nextLine();
ArrayList stringList=新的ArrayList(Arrays.asList(strArray));
添加(用户输入);
strArray=stringList.toArray(strArray);
}
公共静态无效重新投资(){
扫描仪输入=新扫描仪(System.in);
System.out.println(“要删除哪个字符串?”);
字符串用户输入;
userInput=input.nextLine();
ArrayList stringList=新的ArrayList(Arrays.asList(strArray));
stringList.remove(用户输入);
strArray=stringList.toArray(strArray);
}
公共静态void displaystings(){
用于(字符串s:strArray){
如果(!(s==null)){
系统输出打印项次;
}
}
}
公共静态void searchArray(){
扫描仪输入=新扫描仪(System.in);
System.out.println(“要在数组中搜索哪个字符串?”);
字符串用户输入;
userInput=input.nextLine();
ArrayList stringList=新的ArrayList(Arrays.asList(strArray));
if(stringList.contains(userInput)){
System.out.println(“字符串数组包含该字符串!”);
}
否则{
System.out.println(“字符串数组不包含该字符串…”);
}
}
公共静态void sortArray(){
/*ArrayList stringList=新的ArrayList(Arrays.asList(strArray));
Collections.sort(stringList);
strArray=stringList.toArray(strArray)*/
/*用于(字符串s:strArray){
如果(!(s==null)){
数组。排序(strArray);
}
}*/
List-stringList=newarraylist(Arrays.asList(strArray));
Collections.sort(stringList);
strArray=stringList.toArray(strArray);
//数组。排序(strArray);
}
}

您得到
NullPointerException
s的原因可以用(我的重点)来解释:

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

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

现在解决此问题的方法是确保数组中的所有
null
元素都替换为非
null
,例如
“”
。因此,在创建时和删除
字符串后循环遍历数组,并将
null
元素设置为
“”
。但是,此解决方案可能不会对您的代码执行得太好,因为在删除每个
字符串之后,它需要另一个循环,这可能会变得更加繁重。由于
字符串
池的魔力,它至少不需要您创建一组对象,因此它比您使用其他对象所做的要好一点

更好的解决方案是简单地使用
ArrayList
而不是原始数组;毕竟,您已经在使用一个来管理
addString()
removesting()
,因此从数组转换到
ArrayList
和返回的操作会更少。此外,在排序时,您不需要担心NPE(至少对于您的用例而言;将
null
添加到
集合
w)
 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
public class AClass {



public static void main(String[] args){
    String[] array = new String[]{"HI", "BYE", null, "SUP", ":)"};

    //Sort:

    ArrayList<String> newArray = new ArrayList<String>();
    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<String> stringList = new ArrayList<String>();
    for(int i = 0; i < strArray.length; i++)
    {
       stringList.add(strArray[i]);
    }
    Collections.sort(stringList);
    strArray = stringList.toArray(new String[stringList.size()]);