简体   繁体   English

如何在java中按字母顺序对字符串数组进行排序?

[英]How do I sort an array of strings alphabetically in java?

I'm new to programming/coding and have been stuck on a project in school for a few days now. 我是编程/编码的新手,现在已经在学校停留了几天。 The goal is to take an array full of words (each position is a different word) and sort it alphabetically. 目标是采用一个充满单词的数组(每个位置是一个不同的单词)并按字母顺序排序。 I've tried doing some research on stack overflow already, but I'm having a bit of trouble following some of the examples I've found. 我已经尝试过对堆栈溢出进行一些研究,但是在我发现的一些例子之后我遇到了一些麻烦。 The class and driver (I'm using a two part setup if you will) both compile fine, no problems there. 类和驱动程序(如果你愿意,我使用两部分设置)都可以编译,没有问题。 The problem occurs when I try to use alphaSort from my driver. 当我尝试从我的驱动程序使用alphaSort时,会出现此问题。 I receive a null pointer exception for the line marked below. 我收到下面标记的行的空指针异常。 I've had some trouble with these exceptions in the past, so I'm sure it's something small I'm overlooking. 我过去曾经遇到过这些例外的麻烦,所以我确信这是我忽略的一些小事。 As stated however, I'm not yet fluent enough in the java syntax to catch a small error like that. 然而,如上所述,我还没有足够流畅的java语法来捕获像这样的小错误。

I figured I should just include the entire method in-case my error is something in the beginning, before the sorting part. 我想我应该只包括整个方法,以防我的错误在开始之前,在排序部分之前。 What I have so far (i found this on Stack overflow): 我到目前为止(我在Stack溢出时发现了这个):

public void alphaSort()
{
    String alphaList[] = new String[wordList.size()];
    int count=0;
    //puts wordList into alphaList for easier sorting
    while(count<wordList.size()-1)
    {
        alphaList[count]=wordList.get(count);
        count++;
    }
    int shortestStringIndex;
    //sort begins here
    for(int j=0; j<alphaList.length -1; j++)
    {
        shortestStringIndex = j;
        for(int i=j+1; i<alphaList.length; i++)
        {
            if(alphaList[i].trim().compareTo(alphaList[shortestStringIndex].trim())<0) //null pointer exception points here
            {
                shortestStringIndex = i;
            }
        }
        if(shortestStringIndex !=j)
        {
            String temp = alphaList[j];
            alphaList[j] = alphaList[shortestStringIndex];
            alphaList[shortestStringIndex]=temp;
        }
    }
    //prints out results
    count=0;
    while(count<alphaList.length)
    {
        System.out.println(alphaList[count]);
        alphaOut.print(alphaList[count]);
        count++;
    }
}

Any help would be greatly appreciated. 任何帮助将不胜感激。 Please be as thorough as possible in giving an answer (as i said, I'm a bit of a java newbie). 请尽可能详尽地给出答案(正如我所说,我是一个java新手)。 Thanks :) 谢谢 :)

edit: to test for null values (which i assume are spots in my array list that are blank) i made the following method: 编辑:测试空值(我假设我的数组列表中的点是空白的)我做了以下方法:

    public void isNull()
{
    int count=0;
    while(count<wordList.size()-1)
    {
        if((wordList.get(count)).equals(""))
        {
            System.out.println("null");
            break;
        }
        else
        {
            System.out.println("nothing yet");
        }
        count++;
    }
}

the while loop never broke early, my method ran to completion. while循环从未破坏,我的方法跑完了。

You need to update the first while loop to match: 您需要更新第一个while循环以匹配:

while(count < wordList.size()) {
            alphaList[count] = wordList.get(count);
            count++;
        }

You aren't copying over every index of the list to the array, which means that when it goes to check the last index, it cannot find a value (NullPointerException). 您没有将列表的每个索引复制到数组,这意味着当它检查最后一个索引时,它找不到值(NullPointerException)。

Edit: 编辑:

Here's my full test class that works: 这是我的完整测试类:

import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    private ArrayList<String> wordList = new ArrayList<String>();

    public Test() {
        wordList.add("Test");
        wordList.add("Bee");
        wordList.add("Pig");
        wordList.add("Dog");
        alphaSort();
    }

    public void alphaSort() {
        String[] alphaList = new String[wordList.size()];
        int count = 0;
        while(count < wordList.size()) {
            alphaList[count] = wordList.get(count);
            count++;
        }
        int shortestStringIndex;
        for(int j = 0; j < alphaList.length - 1; j++) {
            shortestStringIndex = j;
            for(int i = j + 1; i < alphaList.length; i++) {
                if(alphaList[i].trim().compareTo(alphaList[shortestStringIndex].trim()) < 0) {
                    shortestStringIndex = i;
                }
            }
            if(shortestStringIndex != j) {
                String temp = alphaList[j];
                alphaList[j] = alphaList[shortestStringIndex];
                alphaList[shortestStringIndex]= temp;
            }
        }
        count = 0;
        while(count < alphaList.length) {
            System.out.println(alphaList[count++]);
        }
    }

}

Output: 输出:

Bee
Dog
Pig
Test

Try this... 试试这个...

 // sorting array
 if(wordList.size()>0){
   String alphaList[] = new String[wordList.size()];
   //convert list to String array
   alphaList= wordList.toArray(alphaList);
   //sorting
   Arrays.sort(alphaList);
 }

 ........

// let us print all the elements available in wordList
 if(wordList.size()>0){
   for (String word: alphaList) {
   System.out.println("word= " + word);
  }
 }

There is an error when you are copying your List to an array. 将List复制到阵列时出错。 It is inserting a null at the end of the list which is causing your NullPointerException. 它在列表的末尾插入一个null,导致你的NullPointerException。 Here is the revised version that works. 这是修订后的版本。 Instead of looping through the List and copying each item to the array(which is buggy) I just use the standard java method that is on a List to convert the List to an array. 我没有循环遍历List并将每个项复制到数组(这是错误的),而是使用List上的标准java方法将List转换为数组。

public static void alphaSort()
{
    String alphaList[] = wordList.toArray(new String[]{});
    int shortestStringIndex;
    //sort begins here
    for(int j=0; j<alphaList.length -1; j++)
    {
        shortestStringIndex = j;
        for(int i=j+1; i<alphaList.length; i++)
        {
            if(alphaList[i].trim().compareTo(alphaList[shortestStringIndex].trim())<0) //null pointer exception points here
            {
                shortestStringIndex = i;
            }
        }
        if(shortestStringIndex !=j)
        {
            String temp = alphaList[j];
            alphaList[j] = alphaList[shortestStringIndex];
            alphaList[shortestStringIndex]=temp;
        }
    }
    //prints out results
    int count=0;
    while(count<alphaList.length)
    {
        System.out.println(alphaList[count]);
        alphaOut.print(alphaList[count]);
        count++;
    }
}

问题是你要将wordList.size()-1个项添加到数组中,数组大小是wordList.size() ,这意味着数组中的最后一个值为null

For this while loop: 对于这个while循环:

while (count<wordList.size()-1)
{
    alphaList[count]=wordList.get(count);
    count++;
}

you don't need to loop to wordList.size()-1 since you already do < instead of <= . 你不需要循环到wordList.size()-1因为你已经<而不是<= You are stopping your loop at the second to last index and are thus not assigning a value to the last place in the array. 您在第二个到最后一个索引处停止循环,因此不会将值分配给数组中的最后一个位置。 Instead do while (count < wordList.size()) or while (count <= wordList.size()-1) 而是while (count < wordList.size())while (count <= wordList.size()-1)

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

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