Можно ли написать метод swap в Java? [дубликат]

этот вопрос уже есть ответ здесь:

  • Как написать основную функцию подкачки в Java [дубликат] 19 ответов

вот вопрос: напишите метод, который меняет две переменные. Эти две переменные должны быть примитивными. Это не должно быть общим, например, два int переменные. Есть ли способ?!

13 ответов


без использования массива или объектов нет, это невозможно сделать в рамках метода.


хотя невозможно написать функцию, которая просто меняет две переменные, можно написать вспомогательную функцию это позволяет вам:

  • обмен двумя переменными с помощью только одно заявление
  • без временных переменных в вызывающий код
  • без 'бокс' примитивы
  • с несколькими перегрузками (одна из них с использованием дженериков), это работает для любой тип

вот как вы могли бы сделать это:

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

это работает, потому что язык Java гарантирует (спецификация языка Java, Java SE 7 Edition, раздел 15.12.4.2), что все аргументы оцениваются слева направо (в отличие от некоторых других языков, где порядок оценки не определен), поэтому порядок выполнения:

  1. первоначальная стоимость b вычисляется для передачи в качестве первого аргумента функция
  2. выражение b = a оценивается, и результат (новое значение b) переданный в качестве второго аргумента функции
  3. функция выполняется, возвращая исходное значение b и игнорирование его нового значения
  4. вы назначаете результат a

если returnFirst слишком длинный, вы можете выбрать более короткое имя, чтобы сделать код более компактным (например,a = sw(b, b = a)). Используйте это, чтобы произвести впечатление на своих друзей и запутать враги :-)


проверьте эту статью JavaWorld, которая объясняет это подробно:

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

обмен двух примитивов никогда не будет работать, потому что примитивы передаются по значению в Java. Вы даже не можете написать метод для замены двух объектов в этом отношении.

Как сказал @Thomas, единственное, что вы можете сделать, это ваши примитивы, содержащиеся в других объектах / массивах, и изменить те.


однострочный для любых примитивных чисел:

a += (b - (b = a));

вы можете сделать универсальную версию метода @ marcus swap, который обменивает любое количество объектов одного типа:

<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);

в java5, самое близкое, что я могу придумать, что может вам помочь, это:

класс AtomicInteger (и другие)getAndSet() атомные методы ..


чтобы написать метод swap, который обменивает примитивы, вы должны иметь понятие" out " переменных, т. е. переменных, значения которых передаются до вызывающего контекста. В C#, но вы все равно должны указать, что они переменные.


эта функция поменяет местами два ints

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

вот метод, который меняет местами две примитивные переменные

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

Она не может быть много пользы, хотя ;)

Ok серьезно, это можно сделать, если переменные имеют уровень класса:

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;
    }
}

опять же, я не вижу, какое использование этого может быть


Я прочитал вышеуказанные ответы, ища объяснение, почему говорится, что программа подкачки не может быть написана на java так, как она написана на C++. Я сделал следующее программы скриншоты


Как сказал Томас Оуэнс. Вероятно, вы могли бы сделать это в C, передавая переменные по &reference, но afaik не в Java без использования объектов.


да можно поменять местами две переменные с помощью метода. но вы должны объявить этот метод с пустыми скобками, а затем вызвать его ссылка(пустые скобки) . Вот пример, иллюстрирующий замену двух переменных с помощью метода.

обмен публичными классами

{

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);
  }

}

при компиляции вышеуказанного кода вывод получается следующим образом:

до замены

A= Яблоко!--4-->

B= Bat

после замены

A= Bat

B= Яблоко

//в случае вызова по ссылке изменяется исходное значение, если мы внесли изменения в вызываемый метод


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);
    }    
}