Sorting an array of strings in Java

前端 未结 3 1760
半阙折子戏
半阙折子戏 2020-12-22 12:59

The user is allowed to play with an array of strings. They can add strings to the array, remove strings from the array, search for strings in the array, and eventually they

相关标签:
3条回答
  • 2020-12-22 13:26

    The reason you're getting NullPointerExceptions can be explained by the javadoc for Arrays#sort() (emphasis mine):

    Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. All elements in the array must implement the Comparable interface.

    Because Arrays.sort() expects Comparable elements and not null values, you end up with a NullPointerException when the method tries to call compareTo().

    The fix-this-now way of solving this would be to simply make sure all null elements in your array are replaced with something non-null, such as "". So loop through your array at creation and after removing a String and set null elements to "". However, this solution probably wouldn't perform too well for your code, as it requires another loop after every String is removed, which could grow onerous. At least it won't require you to create a bunch of objects, due to the magic of the String pool, so it's a bit better than what you might do with a different object.

    A better solution would be to simply use ArrayList<String> instead of a raw array; after all, you're already using one to manage addString() and removeString(), so you would have less converting from array to ArrayList and back to do. In addition, you wouldn't need to worry about NPEs when sorting (at least for your use case; adding null to a Collection would still result in NPEs when sorting).

    You can also just use a raw array, but managing that would get kind of annoying, so I wouldn't recommend that. If you do it right you won't have to worry about NPEs though.

    0 讨论(0)
  • 2020-12-22 13:32

    No problem! Here you go:

     1. Create a new array
     2. Insert items to that array, in the right order
    

    public class sorter {

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

    }

    This prints:

    :)
    BYE
    HI
    SUP
    null
    

    EDIT: Another very simple way to solve this in a very effiecient manner, is to use 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);
        }
    

    } }

    0 讨论(0)
  • 2020-12-22 13:40

    I guess the simple way of doing things really would be:

    static String[] strArray;
    static {
        strArray = new String[5];
        for(int i = 0, i < strArray.length; i++)
        {
            strArray[i] = "";
        }
    }
    

    And then just call

    Arrays.sort(strArray);
    

    When you want to sort it. If that doesn't work, although I think it should; your initial approach would have been the following:

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

    Although it clearly doesn't seem very memory-friendly.

    0 讨论(0)
提交回复
热议问题