[ジャワ] Javaでの順列機能 – Javaでのスワップ

関数スワップの実装 (スワップ – 変換) Javaでは、C / C やPascalとは多少異なります,… 関数の外に変数の値を変更するには、オブジェクトを使用する必要があります. あなたはを参照することができます 2 VDは、あなたがそれが混乱し、コードを読むために発見した場合、最初に以下の説明を読んでいただくか、下記の詳細を読みたい場合は、以下のその後、その後、コンテンツを交換するためのコードに戻る.

VD1: オブジェクトを使用して、

package VietSource.net.temp;

import java.util.Scanner;

class Number {				// lop Number
	int num;

	public Number(int num) {		// ham khoi tao
		this.num = num;
	}

	public int getNum() {			// ham tra ve gia tri num
		return num;
	}

	public void setNum(int num) {	// ham set gia tri num
		this.num = num;
	}
}

public class MySwap {
	private void swap(Number a, Number b) {		// ham hoan vi
		int temp = a.getNum();					// gan num cua a cho temp
		a.setNum(b.getNum());					// gan num cua b cho a
		b.setNum(temp);							// gan temp cho num cua b
	}

	public static void main(String[] args) {
		Number a, b;								// hai doi tuong Number a va b
		MySwap sw = new MySwap();					// doi tuong sw thuoc lop MySwap
		Scanner scan = new Scanner(System.in);

		System.out.print("Nhap a = ");
		a = new Number(scan.nextInt()); 			// khoi tao a voi num la so nhap vao
		System.out.print("Nhap b = ");
		b = new Number(scan.nextInt()); 			// khoi tao b voi num la so nhap vao
		scan.close();
		System.out.println("Befor swap: a = " + a.getNum() + " b = " + b.getNum());
		sw.swap(a, b);								// su dung ham swap
		System.out.println("After swap: a = " + a.getNum() + " b = " + b.getNum());
	}
}

最高経営責任者(CEO 2 最後のセグメントを使用してください (物質はまた、オブジェクト配列である)

package VietSource.net.temp;

import java.util.Scanner;

public class SwapArray {
	private void swapArray(int arr[], int i, int j){
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	
	public static void main(String[] args) {
		SwapArray sw = new SwapArray();
		Scanner scan = new Scanner(System.in);
		int arr[] = new int[2];
		
		System.out.print("Nhap a = ");
		arr[0] = scan.nextInt();
		System.out.print("Nhap b = ");
		arr[1] = scan.nextInt(); 
		
		System.out.println("Befor swap: a = " + arr[0] + " b = " + arr[1]);
		sw.swapArray(arr, 0, 1);
		System.out.println("After swap: a = " + arr[0] + " b = " + arr[1]);
		
		scan.close();
	}
}

困難の一つ (と物議を醸す) 値渡しとして、JavaプログラミングのC プログラマのためか
パス参照により. 例:

Object a = new Object("Object A"); //kỳ quặc với C++: Object* a = new ...
Object b = a;
b.setNewName("Object B");

はっきりと名前を変更しているC オブジェクトBの開発者の理解によると、全体のオブジェクトの関係もありません. 実際には別のJavaによる, 「オブジェクトB」は両方のBオブジェクトのようであるように、オブジェクトには名前を持つことになります. オブジェクトAと完全に「​​独立した「Bオブジェクトへ: オブジェクトB = a.clone();

しかし、関数のスワップ() このような方法で動作するJavaは参照渡し.

private void swap(Type arg1, Type arg2) {
	Type temp = arg1;
	arg1 = arg2;
	arg2 = temp;
}

だから、!!! Javaは、実際にどのように? 迷路を採用した論争の陰に隠れるので、何?

最初は値渡し、関数内で使用される「可変」のパラメータ値のコピーによって送信されることを理解する必要がある. 関数が戻るときに、それがコピーされたパラメータを破壊する, と渡されたパラメータが変更を影響されない. それに反して、実際には、実際のパラメータを作成するには、別名参照渡しです. ときに直接渡されたパラメータを変更するパラメータの内容変更. ラージオブジェクトにCPUを保存した後にC でコピーを作るに失敗, コピーと/の複合体を初期化する.
それが邪魔に値渡し動作するので、Javaでスワップ機能が動作しません. スワップ機能はARG1とarg2のを返した後、側面を切り替えることができません. しかし、奇妙なことに、関数本体のスワップは、オブジェクト型を変更するメソッドを呼び出した場合, 例えば: arg1.setValue(“変更”);

この考え方によると、値渡し関数スワップの終了後に変更することはできませARG1. 現実は異なっている, ARG1と呼ばれるのsetValue() 機能を終了するときに、引数1の値が変更されました. Cの参照の概念が存在しないことを思い出してください (&). しかし、Cがポインタ (ポインタ) そしてそれは参照することなく強力なCの柔軟性を行う. Javaはポインタを持っていない? 多くの人々がいることを信じている: オブジェクト参照渡しでもあるさプリミティブは値渡しされる (Javaで, オブジェクトは参照によって渡されます, そしてプリミティブは値で渡されます。) この句は、半分だけ正しい. 合格-値によってđượcKhongのPHAIđược参照渡し馬のLAオブジェクトの参照です. 私たちはその答えに知っている:
Javaで上記のすべての答えは奇数CでJavaがあったことを「クリーン」なポインタ構文です. Javaはポインタを持っていますが、ポインタが宣言され、非常にきれいに使用されている. そしてもちろん、それが、Cのように強くはないポインタが、それはまた、すべての潜在的なエラーを「修正」と危険な (キャスティング, ポインタ干し草のポインタ演算をリリース) Cでのポインタの.
Javaで:
オブジェクトa;

C / C のよう
オブジェクト* A;

だから、時
オブジェクトb = aで;

C / C を意味
オブジェクト* B = A; // Bされ、ポインタ


b.setName(“オブジェクトB”);

に相当
B->のsetName(“オブジェクトB”);

b.setNameだから、(「オブジェクトB」) 同じオブジェクトへとBポイントの名前の「オブジェクトB」によっても配置されたオブジェクト "ポイント".

private void swap(Object a, Object b)
{
	Object temp = a;
	a = b;
	b = temp;
}

対応する

void swap(Object* a, Object* b)
{
	Object* temp = a;
	a = b;
	b = temp;
}

明らかにCでこの関数は、この変更がない限り動作しません:

void swap(Object* a, Object* b)
{
	Object temp = *a;
	*a = *b;
	*b = temp;
}

「カーソル」a、bはスタイル値渡し渡され (JavaはCのようであることを理解することができます, すべてのパラメータは、スタイルが値渡し渡され) そのように機能した後にスワップを返す, B不変または割り当てA = Bは意味がありません. しかしa.setValue("...") カーソルが指す変更されたオブジェクト.

リファレンス:
http://javadude.com/articles/passbyvalue.htm
http://java.forumvi.net/t23-topic