4

我做功课。我想为递归构建一个基本案例,其中以升序对给定数字(list2)进行排序。编写此代码的目的是,当所有数字都按升序排列时,应停止调用名为 assending(list2, list1); 的方法;并且 list2 中的所有值都应运送到 list1。例如,list2 = 6,5,4,3,2,1 然后 list2 变为空并且 list1 应该是 1,2,3,4,5,6。我正在尝试将结果与前一个结果进行比较,如果匹配则停止。但我找不到阻止它的基本情况。另外,ascending() 和 fixedPoint() 都是 void 方法。有人有想法吗?大声笑我花了3天...

当我运行我的代码时

6,5,4,3,2,1

5,6,4,3,2,1

4,5,6,3,2,1

3,4,5,6,2,1

2,3,4,5,6,1

1,2,3,4,5,6

1,2,3,4,5,6

1,2,3,4,5,6

1,2,3,4,5,6

1,2,3,4,5,6

无穷.............

public class Flipper
{
public static void main(String[] args)
{   
    Flipper aFlipper = new Flipper();

    List<Integer> content = Arrays.asList(6,5,4,3,2,1);
    ArrayList<Integer> l1 =  new ArrayList<Integer>(content);
    ArrayList<Integer> l2 = new ArrayList<Integer>(); // empty list

    aFlipper.fixedPoint(l2,l1);

    System.out.println("fix   l1 is "+l1);
    System.out.println("fix   l2 is "+l2);
}
public void fixedPoint(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    // data is in list2
    ArrayList<Integer> temp1 = new ArrayList<Integer>(); // empty list

    if (temp1.equals(list2)) 
    {
        System.out.println("found!!!");             
    }

    else
    {
        ascending(list2, list1); // data, null
        temp1 = list1; // store processed value
        System.out.println("st list1 is "+list1);
        System.out.println("st list2 is "+list2);
    }
    fixedPoint(list2, list1); // null, processed data       
}

收到建议后第二次尝试。

else        {
            temp1 = list2;
            System.out.println("temp1: "+temp1); 

// temp1 打印出分配的值

            // store only previous value
            ascending(list2, list1); // data, null

            temp2 = list1;
            // store previous value

            System.out.println("temp1: "+temp1); 

// 在调用ascending() 之后 temp1 变为空 lol 所以无法在 if 语句中进行比较.... 任何人都可以纠正它吗?

            System.out.println("temp2: "+temp2);
        }
        fixedPoint(list2, list1); // previous, proceeded data

在与 dasblinkenlight、Julien S、Nikolas、ZouZou 和 vels4j 进行头脑风暴后,找到了解决方案。我感谢您的思想贡献!:-)

public void fixedPoint(ArrayList<Integer> list1, 
                       ArrayList<Integer> list2)
    {
        List<Integer> content = Arrays.asList(1);
        ArrayList<Integer> temp1 = new ArrayList<Integer>(content); 
        fixedPoint(list2, list1, temp1);
    }
    // Since it is recursive method I needed to create another parameter
    // to store temporary values.
    public void fixedPoint(ArrayList<Integer> list1, 
                           ArrayList<Integer> list2, 
                           ArrayList<Integer> temp)
    {


        ArrayList<Integer> temp1 = new ArrayList<Integer>();
        temp1 = temp;

        if (temp1.equals(list2))
        {
            return;
        }

        else
        {
            temp1.clear(); 
            for(int i = 0; i < list2.size(); i++) 
            // To store temp value of list2, 
            // I used add method.  Because ArrayList is an object type so if I assign 
            // list2 to temp1 then it will assign memory address rather 
            // than values.  Thus I will lose the values after invoking ascending() as 
            // all elements of list2 will shipped to list1.  So List2 becomes empty.
            {
                temp1.add(list2.get(i));
            }
            ascending(list2, list1);

            fixedPoint(list2, list1, temp1);
        }

    }
4

3 回答 3

0

您的问题可能来自使用temp1.equals(list2). 您要使用的是Arrays.equals(temp1, list2).

对此,Peter Lawrey给出了解释。

编辑 是的,我可能应该读得更好。

我刚刚检查过,它似乎 ArrayList 继承.equals()List它的定义不同于array.equals()并且“应该”工作。

于 2013-11-04T09:36:05.990 回答
0

找到 case 时,fixedPoint 中没有返回。因此行 fixedPoint(list2, list1); 无论固定点如何,都将被处理。我无法测试,因为没有提供升序方法,但是我认为

if (CollectionUtils.isEqualsCollection(list1,list2) 
{
    System.out.println("found!!!"); 
    return;            
}

会做的工作。

您将需要 Apache-commons Collections 使用isEqualsCollection对列表执行相等性。

于 2013-11-04T09:38:01.640 回答
0

编写此代码的目的是,当所有数字都按升序排列时,应停止调用名为ascending(list2, list1)

然后你应该添加一个循环来检查元素list1是否按升序排列,如下所示:

public void fixedPoint(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    boolean isAscending = true;
    for (int i = 1 ; (isAscending) && (i < list2.size()) ; i++) {
        isAscending = list2.get(i-1) < list2.get(i);
    }
    if (isAscending) {
        ... // Insert code to copy the data from list2 to list1.
        ... // Note that a simple assignment is not going to work here!
        System.out.println("found!!!");
        return;
    }
    // It's not in ascending order - continue recursing down.
    ascending(list2, list1);
    ArrayList<Integer> temp1 = new ArrayList<Integer>(list1); // store processed value
    fixedPoint(list2, list1);
    // temp1 makes the old value of list1 available for comparison
    System.out.println("st list1 is "+list1);
    System.out.println("st list1 was "+temp1);
    System.out.println("st list2 is "+list2);
}
于 2013-11-04T09:51:40.847 回答