我的选择Sort / Java的建议

时间:2015-06-10 01:00:15

标签: java debugging selection-sort

我的选择排序算法不起作用。 我收到以下错误: //线程中的例外" main"显示java.lang.NullPointerException

注意:这是针对java类的。我没有很多经验。我完成了任务。我试图理解我的排序算法不起作用的原因。 有关如何纠正问题的任何建议?提示? 更正? ......任何帮助都将受到赞赏。 这是我的代码:

    private void sortFlowers(String flowerPack[]) {
        // TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts
        // NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings


         for(int i = 0; i < flowerPack.length; i++){         
         String currentMinFlow = flowerPack[i];
         int minIndex = i;

            for(int j = i; j < flowerPack.length; j++){
               if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){ 
                  currentMinFlow = flowerPack[j];
                     minIndex = j;
                  }
               }


               if(minIndex != i){
                  flowerPack[minIndex] = flowerPack[i];
                  flowerPack[i] = currentMinFlow;
               }
            }
        }

例外:

Exception in thread "main" java.lang.NullPointerException at
    java.lang.String$CaseInsensitiveComparator.compare(String.java:1181) at 
    java.lang.String$CaseInsensitiveComparator.compare(String.java:1174) at 
    java.lang.String.compareToIgnoreCase(String.java:1227) at 
    Assignment01Driver.sortFlowers(Assignment01Driver.java:112) at 
    Assignment01Driver.<init>(Assignment01Driver.java:37) at 
    Assignment01Driver.main(Assignment01Driver.java:5)

2 个答案:

答案 0 :(得分:1)

问题来自于您的阵列是使用固定大小创建的。

 String[] flowerPack = new String[25];

创建引用类型变量数组时,将使用值null初始化每个变量。如果在为每个变量赋值之前调用sortFlowers方法,则会遇到问题。

for(int i = 0; i < flowerPack.length; i++){         
     String currentMinFlow = flowerPack[i];

在上面的段中,您将遍历数组中的所有25个位置,包括仍具有值null的值。然后,以下行导致错误:

if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){ 

由于您在遍历整个数组,因此currentMinFlow的值为null。如果您尝试对null参考值进行方法调用,则最终会得到NullPointerException

通常,当您不确定自己可能拥有多少数据项时,很少需要使用固定大小的数组。在这种情况下,您可能希望使用ArrayList代替标准数组。 ArrayList本质上是一个动态数组,可根据需要增大和缩小以包含存储在其中的元素。这样可以解决null值的问题,因为这会阻止您在数组中使用任何未使用的元素。

替换

String[] flowerPack = new String[25];

ArrayList<String> flowerPack = new ArrayList<>();

如果您想添加或删除ArrayList可以执行的值

// Add value.
flowerPack.add(value);
// Remove value
flowerPack.remove(value);

如果您想访问ArrayList中的某个元素:

String element = flowerPack.get(indexOfElement);

如果您想获得ArrayList的尺寸:

int size = flowerPack.size();

如果您不想修改排序方法,可以通过替换

来保持相同
sortFlowers(flowerPack);

sortFlowers(flowerPack.toArray(new String[0]));

有关其他ArrayList方法和属性的概述,请查看在线文档: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

答案 1 :(得分:0)

错误表明您正在尝试处理包含null值的数组。为了更好地理解,填写数组中的所有25个点并运行程序,它不会给你任何错误。

以下是您需要的解决方案。

private void sortFlowers(String flowerPack[])
{
    //get the length of the array by counting arrays where the value is not null.
    int length = 0;
    for (int i = 0; i < flowerPack.length; i++)
    {
        if (flowerPack[i] != null)
        {
             length = length + 1;
        }
    }

    //just confirm that the count is correct.
    System.out.println(length);

    //set the length to the "length" variable as we have found above.
    for(int i = 0; i < length; i++)
    {         
        String currentMinFlow = flowerPack[i];
        int minIndex = i;
        for(int j = i; j < length;j++){
            if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0)
            { 
                currentMinFlow = flowerPack[j];
                minIndex = j;
            }
        }
        if(minIndex != i){
            flowerPack[minIndex] = flowerPack[i];            
            flowerPack[i] = currentMinFlow;
        }
    }
}

只需用上面的代码替换sortFlowers方法并检查。