2014-10-06 94 views
0

我遇到了插入排序代码的问题。插入与对象,字符串和数组列表排序

公共静态的ArrayList插入排序(ArrayList的playersNames){

System.out.println("roster will now be sorted"); 

    for (int i = 1; i < playersNames.size();i++){ 

     int j = i - 1; 
     Baller tempx = playersNames.get(i); 
     Baller tempy = playersNames.get(j); 
     while (j >= 0 && tempx.getName().compareToIgnoreCase(tempy.getName())< 0){ 
      playersNames.set(i, tempy); 
      playersNames.set(j+1, tempx); 
      j--; 

     } 


     System.out.println(playersNames); 
    } 

    return playersNames; 
} 

输出没有被正确输出。

回答

0

我认为您需要对代码进行一些小的更改,以解决您遇到的问题。

让我们看看这部分代码:

 int j = i - 1; 
    Baller tempx = playersNames.get(i); 
    Baller tempy = playersNames.get(j); 
    while (j >= 0 && tempx.getName().compareToIgnoreCase(tempy.getName())< 0){ 
     playersNames.set(i, tempy); 
     playersNames.set(j+1, tempx); 
     j--; 

    } 

这里的想法是,直到它在正确的地方结束了反复交换与前一个元素的当前元素。这是一个正确的想法,但有一个小错误:在进行交换之后,tempy仍然指向位置为playersNames.get(i - 1)的元素,因此循环的下一次迭代将比较错误的两个元素。此外,您总是在位置i(当前元素开始的位置)执行掉期交易,但您应该在位置j+1(当前元素目前位置)交换。

要改变这一点,你有几个选项。我认为最简洁的选择是消除tempxtempy变量,以确保您不会意外地犯这个错误,而只是通过索引访问事物。例如:

 int j = i - 1; 
    while (j >= 0 && 
      playersNames.get(j).getName().compareToIgnoreCase(playersNames.get(j+1).getName().getName()) < 0){ 
     Baller temp = playersNames.get(j); 
     playersNames.set(j, playersNames.get(j+1)); 
     playersNames.set(j+1, temp); 
     j--; 
    }