4

私は宿題をしています。指定された番号 (list2) を昇順で並べ替える再帰の基本ケースを作成したいと思います。このコードを記述する目的は、すべての数値が昇順になっている場合に、ascending(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 は空になります (笑) 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は、定義が異なり、「動作するはず」であるArrayList を継承.equals()しているようです。Listarray.equals()

于 2013-11-04T09:36:05.990 に答える
0

ケースが見つかった場合、fixedPoint には戻りがありません。したがって、行 fixedPoint(list2, list1); 定点に関係なく処理されます。昇順メソッドが提供されていないためテストできませんが、

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

仕事をするでしょう。

isEqualsCollectionを使用してリストの等価性を実行するには、Apache-commons Collections が必要です。

于 2013-11-04T09:38:01.640 に答える