使用ArrayLists的递归方法

时间:2012-03-31 03:24:12

标签: java recursion arraylist

所以我有这个方法,它将采用一个整数的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 个答案:

答案 0 :(得分:1)

好的,在ruakh的一点清理帮助下,我已经让它正常工作了。 Greg 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

感谢您的帮助,这是一些功课,更多的个人作业,所以感谢添加标签,我没有意识到,也没有想到人们给我正确的答案,只是一个指导,因为我知道我必须用我迄今学到的东西来完成这一点。谢谢大家的帮助!

答案 1 :(得分:0)

  

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

使用Collections API(其中ArrayList是其中的一部分),最佳做法是使用通用接口声明变量:ListSet,{{1} },而不是MapArrayListHashSet等具体实现。

例如,而不是:

HashMap

你应该这样做:

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

如果您查看java.util.List.subList()的JavaDoc,您会看到方法签名是这样的:

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

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

那么第一步是什么?将您的方法更改为接受List而不是List。 (无论哪种方法调用您的ArrayList初始方法仍然可以传递tournament()。)

ArrayList