- Как поменять местами 2 объекта в java?
- Как поменять местами 2 объекта?
- Поменять местами две переменные в Java
- 2. Простой способ: использование временной переменной
- 2.1. Почему бы не поменять метод?
- 3. Без временной переменной
- 3.1. Использование арифметических операций
- 3.2. Использование логических операций
- 3.3. Однострочный вариант
- 4. Анализ производительности
- 5. Вывод
- Как поменять местами элементы массива в java
Как поменять местами 2 объекта в java?
Это свопирует поля a к полям b и наоборот. Я попытался создать такую функцию, но был довольно длинным и неэффективным, так как значения не изменяются, как ожидалось. Любые простые способы сделать это?
В Java вы не можете этого сделать (по крайней мере, если вы имеете в виду ваш вопрос буквально). Какова ваша ситуация? Что-то похожее:
// This is the aTreeNode instance.
TreeNode a = new TreeNode("ValueA", 4711, parentA, leftChildA, rightChildA);// This is the aTreeNode instance.
TreeNode b = new TreeNode("ValueB", 4712, parentB, leftChildB, rightChildB);
У вас есть две переменные a и b , ссылающиеся на каждый экземпляр TreeNode (который я назвал aTreeNode и bTreeNode , чтобы дать им имена, о которых я могу поговорить). И эти экземпляры имеют разные значения в своих полях. Пусть изобразит это:
a -> aTreeNode instance
------------------
"ValueA"
4711
-> parentA instance
-> leftChildA instance
-> rightChildA instanceb -> bTreeNode instance
------------------
"ValueB"
4712
-> parentB instance
-> leftChildB instance
-> rightChildB instance
Если вы вызываете метод, подобный swap(a, b) , метод получает ссылки на aTreeNode и bTreeNode . Поскольку метод не знает, откуда взялись эти ссылки (в нашем случае переменные a и b , но это может быть также элемент массива или результат какого-либо другого вызова метода), лучшее, что он может сделать, это замените содержимое внутри этих экземпляров:
a -> aTreeNode instance
------------------
"ValueB"
4712
-> parentB instance
-> leftChildB instance
-> rightChildB instanceb -> bTreeNode instance
------------------
"ValueA"
4711
-> parentA instance
-> leftChildA instance
-> rightChildA instance
Таким образом, после swap(a, b) позвонить, по- прежнему ссылается на a aTreeNode экземпляр, а b в bTreeNode , они только местами их содержимое. И такие радикальные изменения содержимого экземпляра не очень хорошо вписываются в философию Java, что приводит к проблемам со многими библиотечными классами, например, со всеми коллекциями и картами. Таким образом, вам лучше заменить две переменные без вызова метода:
TreeNode a = new TreeNode("ValueA", 4711, parentA, leftChildA, rightChildA);
TreeNode b = new TreeNode("ValueB", 4712, parentB, leftChildB, rightChildB);TreeNode temp = a;
a = b;
b = temp;
a -> bTreeNode instance
------------------
"ValueB"
4712
-> parentB instance
-> leftChildB instance
-> rightChildB instanceb -> aTreeNode instance
------------------
"ValueA"
4711
-> parentA instance
-> leftChildA instance
-> rightChildA instance
Как поменять местами 2 объекта?
Вычитал что метод в JAVA не может изменять ссылки и переназначать их на новые объекты. Т.е. следующий метод не поменяет местами 2 объекта:
public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; }
Есть ли возможность в Java поменять местами 2 объекта с помощью метода, если да то как?
Что бы при создании 2-ух объектов можно было поменять их местами?
Чтобы поменять местами one и two в данном примере:
Employee one = new Employee (параметры); Employee two = new Employee (параметры); swap(one, two);
Как поменять элементы массива местами?
Как отсортировать массив чисел по возрастанию? пересмотрел кучу примеров и все равно ничего не.
Как поменять местами элементы массива объектов?
Как поменять местами элементы массива объектов?
Поменять местами элементы
Добрый день, мне нужно поменять местами максимальный и минимальный элемент, но у меня, почему то.
Можно вопрос, а зачем менять местами адреса объектов?
В джаве специально отсутствует адресная арифметика. Вам-то она зачем?
Employee one = new Employee (параметры); Employee two = new Employee (параметры);
Надо сделать метод, который принимает в качестве параметра такой же объект. А внутри этого метода Вы имеете доступ ко всем полям, в том числе и приватным. Можете поменять значения как Вы делали в коде в первом методе. Только не забудьте проверить точный тип параметра — с дочерними классами могут начаться проблемы.
А можете пример кода написать?
Добавлено через 1 час 50 минут
Немного еще попрактиковался и составил показательный код, по которому тоже есть пару вопросов.
В методе swap(a, b); я пытаюсь поменять местами 2 экземпляра класса. Как видим сделать это не получилось.
Вопрос: есть ли все таки какой то способ например назначить «Employee a» значения из «Employee b» ?
В методе HappyA(a, b); я уже меняю местами не экземпляры класса, а конкретно поле зарплата 2-ух экземпляров. И сделать это получается. Т.е. получается менять ссылке на объект нельзя назначать новый объект, а переменной можно?
Единственный минус что снижается безопасность т.к. я использую — public double salary;
Вопрос: Можно ли как то это реализовать через public double salary; ?
Заранее очень благодарен за ответ! Пытаюсь разобраться. Код приведен ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
public class ParamTest { public static void main(String[] args) { //Создадим 2 экземпляра класса: Employee a = new Employee("Alice", 70000); Employee b = new Employee("Bob", 60000); //Выводим их зарплаты System.out.println("Before: a=" + a.getSalary()); System.out.println("Before: b=" + b.getSalary()); //Пробуем поменять местами 2 экземпляра класса. Это не сработает. swap(a, b); //Смотрим результат - у каждого осталась своя зарплата System.out.println("After: a=" + a.getSalary()); System.out.println("After: b=" + b.getSalary()); //Пробуем поменять местами не экземпляры класса, а конкретно поле зарплата 2-ух экземпляров //Правда пришлось сделать поле salary публичным в классе Employee HappyA(a, b); //Видим что зарплаты поменялись System.out.println("After: a=" + a.getSalary()); System.out.println("After: b=" + b.getSalary()); } public static void HappyA(Employee x, Employee y) { double salary1 = x.salary; x.salary = y.salary; y.salary = salary1; } public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; } } class Employee { public Employee(String n, double s) { name = n; salary = s; } public String getName() { return name; } public double getSalary() { return salary; } private String name; public double salary; }
Поменять местами две переменные в Java
Иногда нам может понадобиться поменять местами две переменные в нашем коде.
В этом уроке мы увидим несколько способов сделать это, в зависимости от типов переменных, которые мы хотим поменять местами. Затем мы проверим производительность каждого метода.
2. Простой способ: использование временной переменной
Самый простой способ поменять местами две переменные — использовать третью переменную в качестве временного хранилища:
Object a, b; Object temp; temp = a; a = b; b = temp;
Этот метод особенно легко читать и понимать даже новичкам. Его основной недостаток заключается в том, что для него требуется временная переменная.
Мы должны иметь в виду, что этот метод является единственным, который может менять местами переменные объекта .
2.1. Почему бы не поменять метод?
Если нам нужно поменять местами переменные в нескольких точках нашего кода, может показаться заманчивым создать метод для замены переменных следующим образом:
public void swap(Object a, Object b)
К сожалению, это не будет работать в Java , так как ссылки на объекты копируются во время вызова метода.
Если мы действительно хотим иметь метод подкачки, мы должны использовать класс-оболочку вокруг вашего объекта и поменять местами объект, содержащийся в оболочке:
private class Wrapper public String string; >
private static void swap(Wrapper a, Wrapper b) String temp = b.string; b.string = a.string; a.string = temp; >
С помощью этого метода заключенные строки останутся замененными после возврата метода.
3. Без временной переменной
Если наши переменные имеют примитивные типы, мы можем найти способы поменять их местами без временных переменных.
Давайте посмотрим несколько примеров.
3.1. Использование арифметических операций
Мы можем использовать математику для замены переменных без временных переменных несколькими способами. В следующих примерах предположим, что мы хотим поменять местами два целых числа a=5 и b=10 .
Мы можем использовать сложения и вычитания для замены:
a = a + b; // a = 15 b = a - b; // b = 5 a = a - b; // a = 10
Или мы можем использовать умножение и деление:
a = a * b; // a = 50 b = a / b; // b = 5 a = a / b; // a = 10
Мы должны иметь в виду, что этот метод не работает, если какое-либо из чисел равно 0, поскольку первая операция приведет к сохранению нуля, что сделает остальную часть алгоритма бесполезной. Более того, если b = 0, будет выдано исключение ArithmeticException из-за деления на ноль.
Мы также должны позаботиться о емкости примитивов, поскольку сложение/умножение может привести к числам, превышающим максимальное значение типа примитива. Это может привести к ошибкам после замены без выдачи каких-либо исключений.
Например, если a = Integer.MAX_VALUE, то до замены a=2147483647 и b=10 и после замены a=10 , b=-1.
Если мы работаем с типами данных char , byte или short , требуется явное приведение типов, поскольку результатом арифметических операций является значение типа int по крайней мере в Java:
a = (char)(a + b); b = (char)(a - b); a = (char)(a - b);
3.2. Использование логических операций
Если мы работаем с целочисленными типами данных (например, char, short, byte, int, long ), мы можем использовать побитовый оператор исключающее ИЛИ (XOR). Оператор «^» будет обрабатывать побитовую операцию XOR для всех битов наших переменных:
a = a ^ b; // a = 1111 (15) b = a ^ b; // b = 1010 (5) a = a ^ b; // a = 0101 (10)
Мы должны знать, что, как и в случае с арифметическими операторами, побитовый оператор XOR возвращает как минимум тип данных int . Итак, мы должны привести результат XOR для каждой строки, если мы работаем с символами, байтами или короткими переменными.
3.3. Однострочный вариант
Мы можем использовать однострочную версию методов подкачки, чтобы уменьшить размер кода:
b = (a + b) – (a = b); a += b – (b = a); a = a * b / (b = a); a = a ^ b ^ (b = a);
Это работает, потому что выражения оцениваются с учетом приоритета операторов. Если изначально a = 5 и b = 10, последнее выражение эквивалентно a = 5 ^ 10 ^ (b = 5) . Первая операция ( 5 ^ 10 ) — это в точности первая строка многострочного алгоритма, затем мы присваиваем 5 b (скобки имеют приоритет) и, наконец, вычисляем 15 ^ 5 , что является ровно третьей строкой алгоритма.
4. Анализ производительности
Мы только что увидели, что в Java есть несколько способов поменять местами две переменные, но какой из них более эффективен? Чтобы получить представление о производительности каждого алгоритма, мы выполнили циклы методов замены переменных и измерили время, необходимое для замены двух переменных 100 000 раз. Мы запускали тест 10 раз, чтобы рассчитать среднее время выполнения каждого алгоритма. Вот результаты:
Абсолютное время здесь не важно, так как оно зависит от машины, на которой выполняется тест. Мы только видим, что одни алгоритмы медленнее других. Это особенно верно для умножения/деления, которое значительно медленнее, либо в его однострочной версии. Напротив, алгоритм XOR наиболее эффективен как в многострочном, так и в однострочном вариантах.
Обмен объектами с временной переменной также весьма эффективен, что вполне понятно, поскольку в этом случае манипулируются только указатели.
5. Вывод
В этой статье мы рассмотрели, как поменять местами две переменные в Java в зависимости от типа переменных.
Мы описали, как поменять местами объекты, а затем изучили несколько способов поменять местами типы примитивов с помощью нескольких алгоритмов. Наконец, мы рассмотрели производительность каждого метода.
Как всегда, исходный код всех примеров доступен на GitHub .
Как поменять местами элементы массива в java
Чтобы поменять местами два элемента массива в Java, нужно будет воспользоваться временной промежуточной переменной. Для примера создадим массив строк из трёх элементов:
String[] animals = "cats", "dogs", "birds">;
Поменяем местами первый и последний элемент массива:
// Создаём промежуточную переменную и записываем туда первый элемент массива String temp = animals[0]; // Меняем местами значения animals[0] = animals[2]; // Значение первого элемента берем из промежуточной переменной animals[2] = temp; System.out.println(Arrays.toString(animals)); // => ["birds", "dogs", "cats"]