Вот вопрос: напишите метод, который меняет две переменные. Эти две переменные должны быть примитивными. Он не обязательно должен быть общим, например. две переменные int
. Есть ли способ?!
Можно ли написать метод swap в Java?
Ответ 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);
}
}