2

質問が 2 つあります。
まず
、HashMap を返す関数があります。戻り値を読み取るには、次のように記述します。

    HashMap<Integer,String> hs=my_func2();

関数が HashSet を返す場合も同じことを行います。

    HashSet<Integer> hs=my_func();

このようにして返された値が hs にコピーされるのか、それともディープ コピーを作成する必要があるのか​​、それとも次のように作成する必要があるのか​​を知りたかったのです。HashMap hm=new HashMap(my_func2());

2 番目の質問: make_matrix_funciton
を呼び出して行列を作成します。
[0 1 1
0 0 0
0 0 0]次に、この行列をsort_vec
に渡すと、この関数で行列の要素が変化します。Java はポインター ベースではないと思うので、sort_vec を終了すると、マトリックスは元どおりになるはずです。しかし、それは変わりました!
[0 0 0
0 0 0
1 1 0]は
、sort_vec 関数内で適用された変更を示しています。それは正常ですか、そうであれば、それを防ぐために何をすべきですか. 以下のコードはコンパイル可能です。

public static void main(String args[]) {
        int matrix[][]=new int[3][3];
        matrix=make_matrix("011000000");
        int indexes[]={2,1,0};
        int[][] mat=sort_vec(3,matrix,indexes);
    }

    private static int[][] sort_vec(int motifsize,int [][]mat,int[] indexes)
    {
        int[] main_index={0,1,2};

        int l=indexes.length;
        for (Integer i=0;i<l;i++)
            if(indexes[i]!=main_index[i])
            {
                int j=indexes[i];
                int k=main_index[i+1];
                for(;k<l;k++)
                    if(indexes[k]==main_index[i])
                        break;

                indexes[k]=j;
                mat=exchange(motifsize,mat,j,main_index[i]);
            }
        return mat;
    }
    private static int[][] exchange(int motifsize,int [][]matrix,int x,int y)
    {
        int temp;

        for(int i=0;i<motifsize;i++)
        {   
            temp=matrix[i][x];
            matrix[i][x]=matrix[i][y];
            matrix[i][y]=temp;
        }
        for(int i=0;i<motifsize;i++)
        {   
            temp=matrix[x][i];
            matrix[x][i]=matrix[y][i];
            matrix[y][i]=temp;
        }

        return matrix;
    }
    private static int[][] make_matrix(String id)
    {
        int matrix[][]=new int[3][3];
        int c=0;
        for(int x=0;x<3;x++)
            for(int y=0;y<3;y++)
            {
                if(id.charAt(c)=='1' || id.charAt(c)=='5')
                    matrix[x][y]=1;
                c++;
            }
        return matrix;
    }
4

2 に答える 2

6

Javaは常にオブジェクトを参照によって渡すため、関数からHashMap-Objectを返すと、例のhs変数に参照が渡されます。HashSetを新しいHashSetインスタンスのコンストラクターに渡すことは機能しません。元のオブジェクト参照と同じオブジェクト参照を使用して、新しいHashSetを作成します。これらのオブジェクトの1つを変更すると、変更は他のすべての参照ポイントにも表示されます。

コピーを完全にデタッチする場合は、ディープコピー用の独自のメソッドが必要になります。これは、clone()メソッドのJavaDocで次のように記述されているためです。

このHashSetインスタンスの浅いコピーを返します。要素自体は複製されません。

同じことがアレイにも当てはまります。すべての配列はオブジェクトであるため、要素を変更すると、この配列へのすべての参照に対して変更されます。遅延コピーを作成するには、System.arrayCopyを使用します

于 2012-04-23T23:32:53.773 に答える
2

あなたはJavaの参照がどのように機能するかを誤解しています。

最初の部分では、オブジェクトはHashMapへの参照になります。つまり、関数から返されたオブジェクトはすべてです。

2番目の部分では、int [] []への参照を渡します。プリミティブの配列の場合、値は渡されません。したがって、関数は配列を変更します。入力配列を変更しない関数が必要な場合は、関数に渡されたものをコピーするか、関数に渡す前に配列をコピーする必要があります。

Javaソートルーチンの動作は、元の配列を変更することです。

要するに、Javaではオブジェクトまたは配列を「値で渡す」方法はありません。この動作が必要な場合は、オブジェクトを手動で複製(コピーなど)するか、@user3001の提案を使用する必要があります。

これを理解したら、これも読むことをお勧めします:http: //javadude.com/articles/passbyvalue.htm

于 2012-04-23T23:35:19.393 に答える