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 instance

b -> 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 instance

b -> 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 instance

b -> 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"] 

Источник

Читайте также:  Посчитать количество дней между датами питон
Оцените статью