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

时间:2014-06-12 01:27:00

标签: java arrays string sorting 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) 

这是我的代码:

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);

    }

}

3 个答案:

答案 0 :(得分:5)

javadoc for Arrays#sort()(强调我的)可以解释您获得NullPointerException的原因:

  

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

由于Arrays.sort()需要Comparable个元素而不是null个值,因此当方法尝试调用NullPointerException时,您最终会得到compareTo()

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

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

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

答案 1 :(得分:0)

没问题!你走了:

 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);
    }

} }

答案 2 :(得分:0)

我想真正做事的简单方法是:

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()]);

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