0

初めての投稿ですので、間違っていたらすみません。

私が書いたこのプログラムでは、ユーザーはキーボードから整数を 1 つずつ入力します。たとえば、2 4 5 1 3 です。他のメソッドの前に呼び出された場合、reverse メソッドは 3 1 5 4 2 を返します。ただし、sort メソッドが呼び出されて 1 2 3 4 5 が返されると、reverse メソッドが呼び出され、5 4 3 2 1 が返されます。他のメソッドが呼び出された後でも、元の入力の逆の順序を返すために逆を取得する方法はありますか?

   public static void reverse(ArrayList<Integer> num) {
        ArrayList<Integer> newNum= new ArrayList<Integer>();
        newNum = num;   

        Collections.reverse(newNum);
        System.out.println(newNum); 
    }
4

4 に答える 4

2

これを行うたびに:

newNum = num;

あなたはnewNumと同じことを指摘してArrayListnumます。または のいずれかに加えた変更newNumnum、他方に反映されます。それらは同じArrayListインスタンスです。

ArrayListおそらく、同じ要素を含む新しいインスタンスを構築したいと思うでしょう。

ArrayList<Integer> newNum = new ArrayList<Integer>(num);
于 2013-04-26T01:27:54.377 に答える
1

なぜ2つの配列リストを持っていないのですか... 1つは最後の操作の結果で、もう1つは与えられた元のセットです。したがって、結果は常に変化し、元は同じままです。

于 2013-04-26T01:27:39.517 に答える
1

後で保存したい場合は、いじり始める前に、ユーザーが入力した内容のコピーを作成する必要があります。

public static void main(String[] args) {

ArrayList<Integer> num = new ArrayList<Integer>();
ArrayList<Integer> numStartingList; 

//stuff about reading the variable in here

numStartingList = new ArrayList<>(num); 

// read options and show output
}
于 2013-04-26T01:27:56.610 に答える
0

各メソッドで、newNum = num を呼び出すと、「新しく作成した」配列リストへの参照を放棄し、newNum を「num」のメモリ位置に向けることになります (または、いわゆる「浅いコピー」を実行します)。 newNum に対して行うことはすべて num に対して行われ、その逆も同様です。

代わりに、num 配列の「ディープ コピー」を作成します。各メソッドの最初の 2 行を、次のようなプライベート メソッドの呼び出しに置き換えることをお勧めします。

private ArrayList<Integer> copyList(ArrayList<Integer> in) { 
    ArrayList<Integer> out = new ArrayList<Integer>();
    for (int i : in) {
        out.add(i);
    }
    return out;
}

私はそれが正しいかどうかをチェックしていませんが。

幸運を!

于 2013-04-26T01:37:47.440 に答える