1

次のコードでは、swapBig(a、some number、somenumber)の呼び出し(aは配列)がswapBig()のbleh[]にコピーされます。bleh []の値が交換されると、a[]の対応する値も変更されます。なぜこれが発生するのでしょうか。また、元のa []ではなく、bleh []のみが変更されるようにコードを作成するにはどうすればよいですか?本当にありがとう!

public static void swapBig(String bleh[], int to, int from){ //switches data
    //Actually performing the swaps
    String temp;
    temp = bleh[to];
    bleh[to] = bleh[from];
    bleh[from] = temp;
}
public static void quickSort(String a[], String b[], String c[], String d[],
String e[],String f[], int from, int to){
    //performing the quickSort
    if (from >= to) return;
    int p = (from + to) / 2;
    int i = from;
    int j = to;
    while (i <= j){
        if (a[i].compareTo(a[p]) <= 0)
            i++;
        else if (a[j].compareTo(a[p]) >= 0)
            j--;
        else{
            swapBig(a, i, j);
            swapBig(b, i, j);
            swapBig(c, i, j);
            swapBig(d, i, j);
            swapBig(e, i, j);
            swapBig(f, i, j);
            i++;
            j--;
        }
    }
    if (p<j){
        swapBig(a, p, j);
        swapBig(b, p, j);
        swapBig(c, p, j);
        swapBig(d, p, j);
        swapBig(e, p, j);
        swapBig(f, p, j);
        p = j;
    }else if (p>i){
        swapBig(a, p, i);
        swapBig(b, p, i);
        swapBig(c, p, i);
        swapBig(d, p, i);
        swapBig(e, p, i);
        swapBig(f, p, i);
        p = i;
    }
    quickSort(a, b, c, d,e,f, from, p-1);
    quickSort(a, b, c, d,e,f, p + 1, to);
}

public static void main (String args [])
{
    //Asking for options (what to sort by/search for)
    System.out.println("Sort or Search?");
    String look = promptFor.nextLine();
    if (look.equalsIgnoreCase("Sort")){
    System.out.println("Sort by First, Last, Instrument, Instrument Family, 
    Special Title, or University:");
    String toSortBy = promptFor.nextLine();
    if (toSortBy.equalsIgnoreCase("First"))
        quickSort(fname,lname,inst,instFam,title,uni,0,9);
    if (toSortBy.equalsIgnoreCase("Last"))
        quickSort(lname,fname,inst,instFam,title,uni,0,9);
    if (toSortBy.equalsIgnoreCase("Instrument"))
        quickSort(inst,lname,fname,instFam,title,uni,0,9);
    if (toSortBy.equalsIgnoreCase("Instrument Family"))
        quickSort(instFam,lname,inst,fname,title,uni,0,9);
    if (toSortBy.equalsIgnoreCase("Special Title"))
        quickSort(title,lname,inst,instFam,uni,fname,0,9);
    if (toSortBy.equalsIgnoreCase("University"))
        quickSort(uni,lname,inst,instFam,title,fname,0,9);
    print();
    main(null);     }
    else if (look.equalsIgnoreCase("Search")) {
    System.out.println("Which last name do you wish to search for?");
        searchFor(promptFor.nextLine());
    }
    else
    {
        System.out.println("Command Not Recognized\n");
        main(null);
    }
}

}
4

6 に答える 6

6

配列のコピーではなく、配列への参照を渡します。

于 2013-02-20T15:43:52.340 に答える
2

変数blehは変数の値をコピーするaので、実際にblehは実際のオブジェクトを指しています。これで変更するとbleh実際のオブジェクトが変更されます。これは、Javaが値の受け渡しをサポートしているためです。

パスの前にクローンを作成すると、目的の結果を得ることができます。

于 2013-02-20T15:46:23.000 に答える
2

とても簡単です。

配列をスワッピング関数に渡したため、配列の値がスワッピングされます。Javaでは、パラメーターは参照によって渡されます。

これを避けるために。

String[] tempArray = a.clone();
swapBig(tempArray, i, j); //This will not change the values in a, but tempArray.
于 2013-02-20T15:48:24.210 に答える
1

オブジェクトの参照を渡し、この参照を使用した操作によってメインオブジェクトが変更されるためです。

于 2013-02-20T15:45:53.383 に答える
1

配列のコピーを渡す場合は、arrayVar.clone()メソッド、System.arraycopy()、またはArray.copyOf()を使用します。

于 2013-02-20T15:46:52.833 に答える
0

配列をメソッドに渡す場合、Javaは配列Xの複製をそのメソッドに作成しません。参照を配列Xに渡します。

例:

public void swap(Color a, Color b) {
    Color temp = a;
    a = b;
    b = temp;
}

これは効果がありません。だが、

.
.
.
   swap(x, y);
}

public void swap(Color[] a, Color[] b) {
   Color temp = a[0];
   a[0] = b[0];
   b[0] = temp;
}

これにより、x[]の最初の値がy[]の最初の値と交換されます。

于 2020-07-18T11:31:17.010 に答える