2009-09-01 35 views
44

Đây là câu hỏi: viết một phương thức hoán đổi hai biến. Hai biến này phải là nguyên thủy. Nó không cần phải là chung chung hai biến số int. Là có một cách?!Có thể viết phương thức hoán đổi trong Java không?

+0

Chk thông tin out.More này trên swap bằng cách tham khảo. http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html Chk this out.Xem thêm thông tin về trao đổi theo tham chiếu. –

Trả lời

43

Không sử dụng mảng hoặc đối tượng, không, không thể thực hiện nó trong một phương thức.

+2

btw, mảng là đối tượng, vì vậy bạn thực sự chỉ cần nói đối tượng. từ java.sun.com: "Một mảng là một đối tượng chứa chứa một số giá trị cố định của một loại duy nhất." được cầu kỳ tôi biết :) – geowa4

+0

Vì vậy, làm thế nào là nó có thể bằng cách sử dụng mảng hoặc các đối tượng? Các mảng hoặc đối tượng này không được sử dụng bên trong một phương thức? Họ có toàn cầu không? Hoặc có thể một trong những trao đổi các đối tượng bên trong một phương pháp bằng cách sử dụng mảng địa phương hoặc các đối tượng? – c0d3Junk13

+0

@ geowa4 Tôi nghĩ có thể nói cả hai để giới thiệu cho người mới đến rằng mảng là một đối tượng. –

18

Kiểm tra bài viết này JavaWorld giải thích nó một cách chi tiết:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Một hoán đổi hai nguyên thủy sẽ không bao giờ làm việc vì nguyên thủy được truyền theo giá trị trong Java. Bạn thậm chí không thể viết một phương thức để trao đổi hai đối tượng cho vấn đề đó.

Giống như @Thomas cho biết, điều duy nhất bạn có thể làm là có các phần tử gốc của bạn được chứa trong các đối tượng/mảng khác và sửa đổi chúng.

2

Trong java5, gần nhất tôi có thể nghĩ đến, có thể giúp bạn, là:

Lớp AtomicInteger (và những người khác) có getAndSet() phương pháp nguyên tử ..

+0

Câu hỏi đặc biệt về các loại nguyên thủy. Đây là những vật thể. –

+0

@Thomas: "** phải là nguyên thủy" – geowa4

+0

@Thomas OK. Tôi không có một đầu mối sau đó. @ geowa4 Cảm ơn sự hỗ trợ của bạn :-) – KLE

0

Như Thomas Owens nói . Bạn có thể có thể làm điều đó trong C bằng cách chuyển các tham số theo tham chiếu &, nhưng afaik không có trong Java mà không sử dụng các đối tượng.

2

Để viết phương thức hoán đổi hoán đổi nguyên thủy, bạn phải có khái niệm về biến "ngoài", tức là các biến có giá trị được chuyển đến ngữ cảnh gọi. C# có nhưng bạn vẫn phải xác định rằng chúng là các biến.

-4
public class Swap 
{ 
    public static void main (String[]args) 
    { 
     int y = 5; 
     int x = 4; 
     int c; 

     System.out.println("y = "+y); 
     System.out.println("x = "+x); 

     c=x; //c = 4 
     x=y; //x = 5; 
     y=c; 

     System.out.println("\n"); 
     System.out.println("y= "+y); 
     System.out.println("x= "+x); 
    }  
} 
1

Chức năng này sẽ trao đổi hai ints

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

Trong khi nó không phải là có thể viết một hàm mà chỉ đơn giản hoán đổi hai biến, người ta có thể viết một hàm helper cho phép bạn:

  • Swap hai biến sử dụng chỉ có một tuyên bố
  • Nếu không có các biến tạm thời trong mã của người gọi
  • Nếu không có 'đấm bốc' nguyên thủy
  • Với một vài quá tải (một trong số họ sử dụng Generics), nó hoạt động cho bất kỳ loại

Đó là cách bạn có thể làm điều đó:

int returnFirst(int x, int y) { 
    return x; 
} 
int a = 8, b = 3; 
a = returnFirst(b, b = a); // try reading this as a = b; b = a; 
System.out.println("a: " + a + ", b: " + b); // prints a: 3, b: 8 

Điều này hoạt động vì ngôn ngữ Java đảm bảo (Java La Thông số kỹ thuật nguage, Java SE 7 Edition, phần 15.12.4.2) rằng tất cả các đối số được đánh giá từ trái sang phải (không giống như một số ngôn ngữ khác, nơi mà tự đánh giá là undefined), do đó thứ tự thực hiện là:

  1. Giá trị ban đầu của b được đánh giá để được thông qua như là đối số đầu tiên với chức năng
  2. Khái niệm b = a được đánh giá, và kết quả (giá trị mới của b) được thông qua như là đối số thứ hai đến chức năng
  3. chức năng thực hiện, trở về giá trị ban đầu của b và bỏ qua giá trị mới của nó
  4. Bạn assi gn kết quả đến a

Nếu returnFirst quá dài, bạn có thể chọn tên ngắn hơn để tạo mã nhỏ gọn hơn (ví dụ: a = sw(b, b = a)). Sử dụng điều này để gây ấn tượng với bạn bè và nhầm lẫn kẻ thù của bạn :-)

+1

Nếu bạn đặt tên hàm là '_', thì bạn có thể ** gần như ** viết **' a = b; b = a; '**. Xem làm thế nào sạch (?) Nó trông: ** 'a = _ (b, b = a);' ** – marcus

+2

Ouch, _ không được dùng như một định danh trong Java 8 và có thể được loại bỏ trong Java 9. Không chắc chắn những gì họ sẽ sử dụng nó cho. – marcus

+0

điều này thật khủng khiếp và không thể đọc được, ai sẽ muốn làm điều này? – maazza

3

Bạn có thể tạo ra một phiên bản chung của phương pháp trao đổi @ marcus rằng giao dịch hoán đổi bất kỳ số lượng các đối tượng cùng loại:

<T> T swap(T... args) { // usage: z = swap(a, a=b, b=c, ... y=z); 
    return args[0]; 
} 

b = swap(a, a=b); 
z = swap(x, x=y, y=z); 
+0

Một hàm vararg sẽ tạo ra một mảng tạm thời (Object []) để truyền tất cả các đối tượng. Tôi không chắc JIT sẽ hoạt động như thế nào trong thời gian chạy, nhưng việc tạo một mảng để hoán đổi hai giá trị có vẻ hơi lãng phí, trừ khi bạn thực sự cần một hàm 'rotate' cho một số đối tượng không xác định. – marcus

+0

Đối với một số cố định các giá trị bạn có thể làm điều đó [không có mảng] (http: // stackoverflow.com/questions/2393906/how-do-i-make-my-swap-hàm-in-java/20600020 # 20600020). – dansalmo

1

Dưới đây là một phương pháp mà giao dịch hoán đổi hai biến nguyên thủy

private void swap(){ 
    int a = 1; 
    int b = 2; 
    int temp = a; 
    a = b; 
    b = temp; 
} 

nó có thể không được sử dụng nhiều mặc dù;)

Ok nghiêm túc, nó có thể được thực hiện nếu các biến là cấp độ lớp:

public class MyClass{ 
    // excuse horrible coding practice of public mutable fields 
    public int a = 1; 
    public int b = 2; 

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

Một lần nữa, mặc dù tôi không nhìn thấy những gì việc sử dụng này có thể là

+0

Câu trả lời cho câu hỏi này được viết - tại sao lại là downvote? – wonderer

-1

Có nó có thể trao đổi hai biến sử dụng một phương pháp. Nhưng bạn nên khai báo phương thức đó bằng dấu ngoặc đơn trống và sau đó gọi nó bằng tham chiếu (dấu ngoặc đơn trống). Dưới đây là ví dụ minh họa việc hoán đổi hai biến bằng cách sử dụng một phương thức.

public class Trao đổi

{

static String A="Apple"; 
static String B="Bat"; 

    public static void swap() 
    { 
     String k; 
     k=A; 
     A=B; 
     B=k; 

    } 

    public static void main(String[] args) 
    { 
    System.out.println("Before swapping"); 
    System.out.println("A= "+A); 
    System.out.println("B= "+B); 
    swap(); 
    System.out.println("After swapping"); 
    System.out.println("A= "+A); 
    System.out.println("B= "+B); 
    } 

}

Bằng cách biên dịch mã ở trên đầu ra đi như sau:

Trước khi trao đổi

A = của Apple

B = Bát

Sau khi trao đổi

A = Bát

B = của Apple

// Trong trường hợp cuộc gọi bằng cách tham khảo giá trị ban đầu được thay đổi nếu chúng ta thực hiện thay đổi trong phương pháp gọi là

+0

Đây là phương thức hoán đổi giá trị của hai biến trong một lớp, không phải là hai biến được chuyển thành tham số. Và gọi một phương thức không có tham số là KHÔNG gọi phương thức bằng tham chiếu. –

1

Tôi đã đọc các câu trả lời ở trên tìm kiếm giải thích về lý do tại sao người ta nói rằng một chương trình trao đổi không thể được viết bằng java theo cách viết bằng C++. tôi đã làm theo cách sau program screenshot

3

One-lót cho bất kỳ số nguyên thủy:

a += (b - (b = a)); 
Các vấn đề liên quan