Подтвердить что ты не робот

Можно ли написать метод swap в Java?

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

4b9b3361

Ответ 1

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

Ответ 2

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

  • Обмен двумя переменными с помощью только одного оператора
  • Без временных переменных в коде вызывающего абонента
  • Без примитивов <бокs >
  • С несколькими перегрузками (один из них использует generics), он работает для любого типа

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

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 Language Specification, Java SE 7 Edition, раздел 15.12.4.2), что все аргументы оцениваются слева направо (в отличие от некоторых других языков, где порядок оценки undefined), поэтому порядок выполнения:

  • Исходное значение b оценивается для передачи в качестве первого аргумента функции
  • Выражается выражение b = a, и результат (новое значение b) передается как второй аргумент функции
  • Функция выполняет, возвращая исходное значение b и игнорируя его новое значение
  • Вы назначаете результат a

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

Ответ 3

Ознакомьтесь с этой статьей JavaWorld, которая объясняет это подробно:

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

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

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

Ответ 4

Вы можете создать универсальную версию метода обмена @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);

Ответ 5

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

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

Ответ 6

В java5, ближайший, о котором я могу думать, может помочь вам:

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

Ответ 7

Чтобы написать метод подкачки, который заменяет примитивы, вам нужно будет иметь понятие "вне" переменных, то есть переменные, значения которых передаются в вызывающий контекст. У С# есть те, но вы все равно должны указать, что они вне переменных.

Ответ 8

Эта функция заменит два ints

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

Ответ 9

Здесь используется метод, который заменяет две примитивные переменные

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

Это может быть не очень полезно, хотя;)

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

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

Опять же, я не понимаю, что это может быть

Ответ 10

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

Ответ 11

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

Ответ 12

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

public class Swapping

{

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 = Apple

B = Бат

После замены

A = Бат

B = Apple

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

Ответ 13

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