2012-03-31 78 views
0

所以我有这种方法将采取整数的ArrayList,我比较2个子数组之间并进行一些数字交换。使用ArrayList的递归方法

我比较每个子数组的第一个元素,它只是数组的一半,然后交换元素,如果更大的数字不在左边的子列表中。之后,我想递归地做同样的事情,但到上半年。

所以如果我键入3 5 8 2 1 7 6 4 我想看到这个;

[3,5,8,2,1,7,6,4]

[3,7,8,4,1,5,6,2]

[8,7 ,3,4,1,5,6,2]

[8,7,3,4,1,5,6,2]

我希望能够做的是,一旦我有完成我所需要的,对于基本数组,我需要递归地处理同一个数组的前半部分。但是,当我编译时,我得到一个错误,说我有不兼容的类型。所以我假设subList函数不提供给我一个ArrayList。

任何指针gettign这个工作正常吗?

public static void tournament(ArrayList<Integer> players){ 
int mid = players.size()/2; 
    for(int i=0; i < mid; i++){ 
     if(players.subList(0,mid).get(i) < players.subList(mid,players.size()).get(i)){ 
      int temp = players.subList(0,mid).get(i);  
      players.subList(0,mid).set(i , players.subList(mid,players.size()).get(i)); 
      players.subList(mid,players.size()).set(i,temp);  
     }// end if 
    }// end for 
    System.out.println(players); 

    if(players.size() > 2){ 
     tournament(players); 
    }// end if 

}// end tournament 
+2

我不完全明白你想要做什么,但是你的代码的某些部分看起来不必要的复杂。例如,'players.subList(0,mid).get(i)'等同于'players.get(i)';和'players.subList(mid,players.size()).set(i,temp)'相当于'players.set(mid + i,temp)'。没有?事实上,我没有看到你使用'subList' * *完成任何事情的地方。另外,你对'锦标赛(玩家)'的递归调用并没有什么意义,因为它会无限期地递归(直到你遇到'StackOverflowException')。 – ruakh 2012-03-31 03:43:18

+0

我在添加作业标签 – Bohemian 2012-03-31 03:57:22

回答

0

然而,当我编译,我得到一个错误,说我有不兼容的类型。所以我假设subList函数不提供给我一个ArrayList。

与合集API(其中ArrayList是一部分),最好的做法是使用通用接口来声明变量:ListSetMap,而不是他们的具体实现,如ArrayListHashSetHashMap

例如,而不是这样的:

ArrayList<Integer> list = new ArrayList<Integer>(); 

你应该这样做:

List<Integer> list = new ArrayList<Integer>(); 

如果你看一看的JavaDoc为java.util.List.subList(),你会看到方法签名这个:

List<E> subList(int fromIndex, int toIndex) 

ArrayList,作为的实现接口,使用此完全相同的签名。请注意,返回类型是List,而不是ArrayList。这意味着ArrayList.subList()不必返回ArrayList(尽管它可能) - 它只需返回一个符合List接口的对象。

那么第一步是什么?将您的方法更改为接受List而不是ArrayList。 (不管什么方法调用你的tournament()最初的方法仍然可以通过ArrayList。)

public static void tournament(List<Integer> players) 
1

好的,所以借助一下从ruakh清理一下,我已经正确地工作了。 格雷格Kopff是正确的,我不能返回subList,因为它是一个不兼容的类型,所以我所做的是传递两个int元素到方法中。

这些记录了子阵列开始的位置,并通过递归渐进式地靠近。

public static void tournament(ArrayList<Integer> players, int left, int right){ 
    for(int i=0; i < right; i++){ 
     if(players.get(i) < players.get(right + i)){ 
      int temp = players.get(i);  
      players.set(i , players.get(right + i)); 
      players.set(right + i,temp);  
     }// end if 
    }// end for 

    right /= 2; 
    System.out.println(players); 
    if(right>=1){ 
     tournament(players,0,right); 
    } 
}// end tournament 

感谢您的帮助,这是一个有点功课,更贴身的功课十分感谢添加标签,我不知道,我也没有指望别人给我正确的答案,只是一个指南因为我知道我必须用迄今为止所了解的内容来完成这项工作。感谢所有的帮助!