簡體   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