2014-02-27 100 views
0

我想知道是否有人可以告诉我,我的逻辑在这种选择排序(是的,这是教育用途,我意识到有一个Arrays.sort()方法)是有缺陷的。在Java中使用字符串进行选择排序?

public static void selectionSortByName() throws IOException { 
    String temp; 
    for (int i = 0; i <= nameArraySize; i++){ 

     String smallest = name[i]; 


     for (int j = 0; j <= nameArraySize; j++){ 
      if (name[j].compareTo(name[i]) < 0){ 
       temp = smallest; 
       name[j] = temp; 
       name[i] = smallest; 
      } 
     } 

    } 
    } 

我得到我与compareTo方法行一个NullPointerException异常,所以我希望,我只是有一个逻辑错误在我的条件语句之一。

任何帮助将是伟大的,谢谢!

+0

贵'name'阵列包含任何'null'元素? 'name'本身是'null'吗?这种事情可能会产生一个'NullPointerException'。 – Ghostkeeper

+0

把'<='改成'<',我认为你的选择排序不是选择排序 – nachokk

+0

@nachokk这是为了找到我的错误回合#2 ;-) – user2864740

回答

0

1)throws IOException根本不需要!你的代码不会抛出这个检查的异常。

2)改变到nameArraySize name.length

3)正如我所说的在注释改变到<=<

4)AFAIK选择排序不交换,直到它找到最小的一个。

所以,你的代码不错的样子:

public static void selectionSortByName() { 

    for (int i = 0; i < name.length; i++){ 

     int smallest =i; 
     //invariant is sorted in all n < [i] 
     for (int j = i+1; j <= nameArraySize; j++){ 
      if (name[j].compareTo(name[smallest]) < 0){ 
       smallest=name[j]; 
      } 
     } 

     if(!name[smallest].equals(name[i])){ 
      swap(name,i,smallest); 
     } 

    } 
    } 

    public static void swap(String [] name,int i, int j){     
       String temp = name[j]; 
       name[j] = name[i]; 
       name[i] = temp; 
    } 
2

显然,你的nameArraySize不适合阵列name的实际长度,或者你的名字[i]中的一些单元格等于null。

Altough,我没有看到在使用一些冗余变量的一个点,如果你可以使用这样的:

啊,现在我看到它,你有<=代替<

for (int i = 0; i < name.length; i++) 

编辑

+0

我试过了,它确实如此:“iejge”.compareTo(null); – libik

+0

你是对的 - 出于某种原因,我认为当提供的参数为null时,它会产生一个值。 (而且,javadoc显然缺少可记录的异常: - /) – user2864740

相关问题