繁体   English   中英

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

[英]Sorting an array of strings in Java

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

    }

}

你得到NullPointerException的原因可以用Arrays#sort()javadoc解释(重点是我的):

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

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

解决这个问题的现在解决方法是简单地确保数组中的所有null元素都被替换为非null元素,例如"" 因此,在创建时和删除String后循环遍历数组并将null元素设置为"" 但是,此解决方案对于您的代码来说可能不会表现得很好,因为它需要在删除每个String后进行另一个循环,这可能会变得很繁重。 至少它不需要你创建一堆对象,由于String池的魔力,所以它比你可能用不同的对象做的要好一些。

更好的解决方案是简单地使用ArrayList<String>而不是原始数组; 毕竟,您已经在使用一个来管理addString()removeString() ,因此您将减少从数组到ArrayList转换,然后再返回。 此外,您在排序时无需担心 NPE(至少对于您的用例;将null添加到Collection仍然会在排序时导致 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<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()]);

虽然它显然看起来不太适合记忆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM