2010-01-11 25 views
22

मैं निम्नलिखित कोड है:जावा: यह स्वैप विधि क्यों काम नहीं करती है?

public class Main { 

    static void swap (Integer x, Integer y) { 
     Integer t = x; 
     x = y; 
     y = t; 
    } 

    public static void main(String[] args) { 
     Integer a = 1; 
     Integer b = 2; 
     swap(a, b); 
     System.out.println("a=" + a + " b=" + b); 
    } 
} 

मैं इसे एक = 2 ​​ख = 1 मुद्रित करने के लिए उम्मीद है, लेकिन यह विपरीत प्रिंट करता है। तो जाहिर है स्वैप विधि ए और बी मानों को स्वैप नहीं करती है। क्यूं कर?

+8

कृपया मूल्य द्वारा कॉल के बीच का अंतर देखें और संदर्भ से कहते हैं। –

+1

विधि स्वैप में आप ऑब्जेक्ट के 'मान' पास कर रहे हैं और वास्तविक ऑब्जेक्ट का संदर्भ नहीं, जो भी आप स्वैप विधि के अंदर करते हैं, उसका चर और ए पर कोई प्रभाव नहीं पड़ेगा। –

उत्तर

42

इसमें पूर्णांक की अपरिवर्तनीयता के साथ कुछ भी नहीं है;

सारांश में: यह सच है कि Java is Pass-by-Value, Dammit!(पी नाराज नहीं, बस लेख के शीर्षक): के साथ क्या करना है, तो आप वास्तव में जावा में एक स्वैप विधि नहीं कर सकता। आपको बस स्वैप करना होगा, जहां भी आपको इसकी आवश्यकता हो; जो वैसे भी कोड का सिर्फ तीन लाइनों है, इसलिए कि एक समस्या :) जावा में

Thing tmp = a; 
    a = b; 
    b = tmp; 
+4

डाउन-वोट क्यों? क्या मैंने कुछ गलत समझा है? – Svish

+0

लेकिन अगर इंटीजर उत्परिवर्तनीय था और उदाहरण के लिए एक सेटवैल्यू फ़ील्ड था, तो सेटवैल्यू को कॉल करके मानों को स्वैप करना एक दृश्यमान परिवर्तन होगा। तो इसमें उत्परिवर्तन के साथ कुछ करने के लिए है कि आप अभी भी एक शून्य विधि हो सकती है जिसने ऑथर चाहता है परिणाम प्राप्त किया। –

+7

लेकिन आप वास्तव में पूर्णांक को स्वैप नहीं किया होता, जो लक्ष्य लगता है। अगर मेरे पास दो कारों के साथ एक पार्किंग स्थल है और फिर पहली कार दूसरी कार की तरह दिखती है और दूसरी कार बिल्कुल पहली कार की तरह दिखती है, तो क्या मैंने कारों को बदल दिया होगा? ज़रुरी नहीं। मैं बस इस तरह से दिखाई देने के लिए * बहुत * काम किया होगा। – Svish

0

इंटीजर अपरिवर्तनीय हैं - आप उनके मूल्यों को नहीं बदल सकते हैं। स्वैप फ़ंक्शन के अंदर होने वाली स्वैपिंग संदर्भों के लिए संदर्भों के लिए है।

आप एक सरणी में दोनों संदर्भों को वापस जाने के लिए प्राप्त करने के लिए क्या आप

static Integer[] swap(Integer a, Integer b) { 
    return new Integer[]{b, a}; 
} 

public static void main(String[] args) { 
    Integer a = 1; 
    Integer b = 2; 

    Integer[] intArray = swap(a, b); 

    a = intArray[0]; 
    b = intArray[1]; 

    System.out.println("a=" + a + " b=" + b); 
} 

पूर्णांक एक setValue विधि था, तो आप कुछ इस तरह कर सकता है चाहता हूँ की आवश्यकता होगी।

static void swap(Integer a, Integer b) { 
    int temp = a.intValue(); 
    a.setValue(b.intValue()); 
    b.setValue(temp); 
} 

लेकिन ऐसा नहीं है - ताकि आप जो चाहते हैं उसे प्राप्त करने के लिए, एक सरणी लौटाएं।

+8

इंटीजर अपरिवर्तनीयता यहां समस्या नहीं है। – Svish

6

सब कुछ मान द्वारा पारित कर दिया है और चरों के मान की ज्यादा नहीं होना चाहिए हमेशा पुरातन या संदर्भ आपत्ति कर रहे हैं।

1

आपको संदर्भ में पैरामीटर पारित करने की आवश्यकता होगी, जो जावा में संभव नहीं है। इसके अलावा इंटीग्रेट्स अतुलनीय हैं, इसलिए आप मानों का आदान-प्रदान नहीं कर सकते क्योंकि आपके पास सेटव्यू विधि नहीं है।

2

जैसा कि स्विस और अन्य ने बताया कि यह मूल्य में कॉल है, जावा में संदर्भ के अनुसार नहीं। चूंकि आपके पास जावा में कोई पॉइंटर्स नहीं है, इसलिए आपको इस तरह के मूल्यों को वास्तव में स्वैप करने के लिए किसी प्रकार की धारक वस्तु की आवश्यकता है। उदाहरण के लिए:

static void swap(AtomicReference<Integer> a, AtomicReference<Integer> b) { 

    Integer c = a.get(); 
    a.set(b.get()); 
    b.set(c); 

} 

public static void main(String[] args) { 

    AtomicReference<Integer> a = new AtomicReference<Integer>(1); 
    AtomicReference<Integer> b = new AtomicReference<Integer>(2); 

    System.out.println("a = " + a); 
    System.out.println("b = " + b); 

    swap(a, b); 

    System.out.println("a = " + a); 
    System.out.println("b = " + b); 

} 
+1

पीएस परमाणु संदर्भ का उपयोग करना आपके लिए शायद अधिक समझ में नहीं आता है क्योंकि यह एक अनिवार्य मुहावरे है। यदि आपको थ्रेड-सुरक्षित व्यवहार की आवश्यकता नहीं है तो अपना खुद का धारक लिखें। – yawn

+0

"आपके पास जावा में कोई पॉइंटर्स नहीं है"। मुझे लगता है कि जावा में पॉइंटर्स की अवधारणा है लेकिन इसका उपयोग करने के लिए प्रोग्रामर के निपटारे में नहीं है। –

+2

जहां तक ​​मुझे पता है, आपके पास जावा में पॉइंटर्स हैं।उन्हें संदर्भ कहा जाता है और आप उन्हें विभिन्न तरीकों से विभिन्न भाषाओं में कर सकते हैं क्योंकि आप उन्हें कुशल नहीं बना सकते हैं। – Svish

2

आप पूर्णांक वस्तुओं के लिए एक स्वैप विधि लागू करना चाहते हैं, तो आप एक सरणी (या ArrayList) और स्वैप सरणी के अंदर में मान रैप करने के लिए किया है। यहाँ अपने कोड पर आधारित एक फिल्म है:

public class Main { 

    static void swap (Integer[] values) { 
     if ((values == null) || (values.length != 2)) { 
      throw new IllegalArgumentException("Requires an array with exact two values"); 
     } 

     Integer t = values[0]; 
     values[0] = values[1]; 
     values[1] = t; 
    } 

    public static void main(String[] args) { 
     Integer a = 1; 
     Integer b = 2; 
     Integer[] integers= new Integer[]{a,b}; 
     swap(integers); 
     System.out.println("a=" + integers[0] + " b=" + integers[1]); 
    } 
} 

(बस इस सवाल का जवाब क्योंकि Svish उल्लेख कहा, कि FG "आप वास्तव में एक स्वैप विधि जावा में नहीं कर सकते हैं")

0

के रूप में सब लोगों ने इसे पास-बाय-वैल्यू चीज़ का उल्लेख किया।

बस जोड़ना पसंद आया: आप ग्लोबल पूर्णांक को स्वैप करने की इस विधि का उपयोग कर सकते हैं।

private void swap(){ 
    a ^= b; 
    b ^= a; 
    a ^= b; 
} 

यह एक और चर के प्रयोग को समाप्त कर, और उसके सिर्फ कूलर :)

+2

हैं, यह अच्छा हो सकता है, लेकिन यह बहुत पठनीय नहीं है। –

+0

स्वैप का कूल संस्करण - अतिरिक्त चर के बिना, मुश्किल और छात्रों को यह पूछने के लिए अच्छा है कि यह कैसे करें ;-), लेकिन ... यह जावा में काम नहीं कर रहा है :-(या यह है? – WildWezyr

+0

@WildWezyr कैसे नहीं? सावधान रहें कि ए और बी वैश्विक होना चाहिए, अन्यथा आपको – medopal

0

का उपयोग XOR ऑपरेटर एक बहुत बुरा विचार है:

सबसे पहले, यह अब तक कम पढ़ी जा सकती है। दूसरा, ऐसे समय थे जब यह तेज़ था लेकिन आजकल विपरीत मामला है।

Wikipedia

संदर्भ के लिए

देखें।

+2

एफवाईआई, क्योंकि SO reshuffles जवाब देते हैं जब वे मतदान करते हैं/नीचे मतदान करते हैं, आमतौर पर एक टिप्पणी को जोड़ने के लिए "टिप्पणी जोड़ें" लिंक का उपयोग करना एक अच्छा विचार है, जिसके बाद आप एक नए उत्तर में टिप्पणी लिख रहे हैं। यह समझना आसान बनाता है कि क्या यू आर कमेंटिंग। – Fredrik

0

जावा कोड:

class swap { 

    int n1; 
    int n2; 
    int n3; 

    void valueSwap() { 
     n3 = n1; 
     n1 = n2; 
     n2 = n3; 
    } 

    public static void main(String[] arguments) { 

     Swap trial = new Swap(); 
     trial.n1 = 2; 
     trial.n2 = 3; 

     System.out.println("trial.n1 = " + trial.n1); 
     System.out.println("trial.n2 = " + trial.n2); 

     trial.valueSwap(); 

     System.out.println("trial.n1 = " + trial.n1); 
     System.out.println("trial.n2 = " + trial.n2); 

    } 
} 

आउटपुट:

trial.n1 = 2 
trial.n2 = 3 
trial.n1 = 3 
trial.n2 = 2 
0

का उपयोग स्कैनर:

import java.util.*; 
public class Swap { 
public static void main(String[] args){ 
    int i,temp,Num1,Num2; 
    Scanner sc=new Scanner(System.in); 
    System.out.println("Enter Number1 and Number2"); 
    Num1=sc.nextInt(); 
    Num2=sc.nextInt(); 
    System.out.println("Before Swapping Num1="+Num1+" Num2="+Num2); 
    temp=Num1; 
    Num1=Num2; 
    Num2=temp; 
    System.out.println("After Swapping Num1="+Num1+" Num2="+Num2); 
}  
} 
संबंधित मुद्दे