0 / 0 / 0
Регистрация: 15.07.2012
Сообщений: 8
1

Функция swap для обмена данных между переменными

14.11.2012, 13:05. Показов 44664. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте, начал писать на java недавно, для удобства решил написать функцию, чтоб меня значения между двумя переменными в частности между двумя int a,b; и двумя строками String a,b;

Java
1
2
3
4
5
6
public static void swap(String a, String b){
        String c;
        c=a;
        a=b;
        b=c;    
    }
Но столкнулся с проблемой, значения параметров меняются только внутри функции, и при выводе ничего не меняется.
Буду очень благодарен, если поможете с моей проблемой.
P.S. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2012, 13:05
Ответы с готовыми решениями:

Функция swap перестановки значений двух переменных для данных разных типов. Используйте template
не могу решить ( честно говоря вообще не понимаю его ) ((((( Напишите функцию swap перестановки...

Существует ли в Лазарусе процедура Swap для обмена объектов местами?
Есть ли процедура как в делфи (procedure Swap) для lazarus? Требуется вспомогательная процедура...

Функция interchange(), которая выполняет обмен значений между двумя переменными
Нужно написать программу с функцией interchange(), которая выполняет обмен значений между двумя...

Функция, которая выполняет обмен значений между двумя целочисленными переменными
Задание такое: написать функцию, которая выполняет обмен между двумя целочисленными переменными....

14
Музыка нас Связала
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
14.11.2012, 13:41 2
Проблема здесь в том, что формальные параметры и реальные переменные имеют одно и тоже название. Переменуйте их, и всё будет работать. И да, "a и b" должны быть доступны для статического метода.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test
{
    static String a = "String A";
    static String b = "String B";
    
    public static void swap(String x, String y)
    {
        String c;
        c = x;
        a = y;
        b = c;
    }
 
    public static void main(String[] args)
    {        
        System.out.println("a = " + a + "; b = " + b);
        swap(a, b);
        System.out.println("a = " + a + "; b = " + b);
    }
}
Код
a = String A; b = String B
a = String B; b = String A
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
14.11.2012, 14:19 3
Проблема здесь в том, что ссылки на объекты в ява передаются по значению а не по ссылке.
Поэтому присвоение параметру функции значения не приведет к изменению объекта вне функции. Что ваш пример и показал.
В данном случае можно поместить переменные в массив или содавать обертки для строк (интов) и передавать их.
0
0 / 0 / 0
Регистрация: 15.07.2012
Сообщений: 8
14.11.2012, 17:05  [ТС] 4
Спасибо вам конечно)) Но если честно я не совсем понял все же как это сделать (вот такой вот я глупый).
И еще проблема в том что строки мне не нужно запихивать в массив(
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
14.11.2012, 17:31 5
Общий смысл в том, что нельзя заменить переданный объект, только его состояние. Т.е. здесь:
Java
1
2
3
4
5
6
7
8
9
10
public static void change( String a ) {
  a = "asd"
}
 
public static void main( String[] args ) {
  String a = "qwe";
  System.out.println( a );
  change(a);
  System.out.println( a );
}
на выводе будет: qwe qwe.

Однако, можно поменять внутреннее состояние объекта, например, есть класс class StringWrapper { String a; }, тогда:

Java
1
2
3
4
5
6
7
8
9
10
11
public static void change( StringWrapper w ) {
  w.a = "asd"
}
 
public static void main( String[] args ) {
  StringWrapper w = new StringWrapper();
  w.a = "qwe";
  System.out.println( w.a );
  change(w);
  System.out.println( w.a );
}
на выводе все пучком: qwe asd.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
14.11.2012, 20:13 6
Цитата Сообщение от zergi2 Посмотреть сообщение
Общий смысл в том, что нельзя заменить переданный объект, только его состояние.
Тема для изучения Мутабельные объекты и Иммутабельные
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
14.11.2012, 21:20 7
Цитата Сообщение от mutagen Посмотреть сообщение
Тема для изучения Мутабельные объекты и Иммутабельные
Вот, кстати, нет, вернее не только эта.

Если сделать:
Java
1
2
3
4
public static void change( StringWrapper w ) {
  w = new StringWrapper();
  w.a = "asd"
}
ничего не получится, хоть и передается мутабельный объект.

Так что, тема для изучения, где была основная ошибка, это передача параметров по ссылке/значению.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
14.11.2012, 22:47 8
а вот и нет
Java
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
package mutant;
 
public class MutableVsImmutable {
 
    public static void main(String[] args) {
        MutableString ms = new MutableString("aaa");
        System.out.println(ms);
        mutator(ms);
        System.out.println(ms);
    }
 
    static <M extends Mutant> void mutator(M m) {
        m.setStr("bbb");
    }
 
    static class MutableString implements Mutant {
        private String str;
 
        @Override
        public String getStr() {
            return str;
        }
 
        @Override
        public void setStr(String str) {
            this.str = str;
        }
 
        @Override
        public String toString() {
            return "MutableString [str=" + str + "]";
        }
 
        public MutableString(String str) {
            super();
            this.str = str;
        }
 
    }
 
    interface Mutant {
        public String getStr();
        public void setStr(String str);
    }
 
}
Bash
1
2
MutableString [str=aaa]
MutableString [str=bbb]
Цитата Сообщение от zergi2 Посмотреть сообщение
w = new StringWrapper();
кстати это уже новый объект, а не то что вам показалось
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
14.11.2012, 23:50 9
И к чему вообще эта хрень с интерфейсом и дженериками, если по сути это тот же простой StringWrapper из моего примера?

Если вы внимательно посмотрите на пример тс, вы поймете что проблема не в мутабельности строк, а в том, что тс предполагал поменять ссылки объектов, присвоив один другому внутри метода.

А еще мне очень интересно, что мне там показалось, потрудитесь объяснить.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.11.2012, 07:24 10
Цитата Сообщение от zergi2 Посмотреть сообщение
потрудитесь объяснить.
Я уже потрудился - ваше w = new StringWrapper(); это создание нового объекта и присвоение переменной его адреса, а не обмен как вам кажется.
Вопрос ТС я внимательно смотрел и в первый раз, мой ответ был ВАМ а не ТС, чтобы ВЫ разобрались что такое мутабельный класс прежде чем давать советы. То как вас научили в с++ обмениваться ссылками на объекты к мутабельности в ява не имеет ни малейшего отношения, чего вы явно не понимате так как создаёте новый объект и присваиваете новую ссылку думая что работаете с мутабельным объектом, потому и пример мой основан на вашем мутабельном стринге, но вы конечно же не озаботились запустить и посмотреть результат того что ваш мутабельный обьект в методе прекрасно изменился
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
15.11.2012, 07:29 11
Цитата Сообщение от mutagen Посмотреть сообщение
Цитата Сообщение от zergi2 Посмотреть сообщение
Общий смысл в том, что нельзя заменить переданный объект, только его состояние.
Тема для изучения Мутабельные объекты и Иммутабельные
написал mutagen, и привел пример как меняется состояние. Вы же хотели противопоставить пример, именно тому что вы цитировали, или нет?
Если да - то пример плох, он как раз показывает, что вы меняете состояние MutableString. Если нет - то к чему спор, не понятно.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.11.2012, 11:11 12
Цитата Сообщение от turbanoff Посмотреть сообщение
не понятно
действительно - непонятно, надеюсь в этот раз ответ точно отражает цитируемый кусочек
не стану приводить пример - вдруг будет плох
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
15.11.2012, 12:53 13
Ну я последний раз повторю, что проблема у автора с присвоением ссылок. А мутаген считает что дело в немутабельности строк, хотя в примере тс мутабельности-немутабельности и близко нет.
Решается вопрос, да, сменой состояния обертки, что я продемонстрировал в своем первом примере. Без интерфейсов и дженериков )))

И да, на плюсах я никогда не писал, кому-то стоит делать поменьше предположений.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.11.2012, 14:17 14
Цитата Сообщение от zergi2 Посмотреть сообщение
И да, на плюсах я никогда не писал, кому-то стоит делать поменьше предположений.
забираю назад предположение про с++

у меня акцент был не на женериках и интерфейсах (это так просто захотелось чего-то вычурного, надоел простой код на форуме), а на том что внутри метода change Вы сделали

Java
1
2
3
4
5
var = new TypeObj(); // создав новый обьект, подразумевая этим действием мутирование или изменение ссылки???
// вместо попытки обмена ссылками
tmp = var1;
var1 = var2;
var2 = tmp;
странно что эту часть все аккуратно не заметили, зато заметили перегруженный хламом код (женерики, etc .. ),

ну и под занавес, я уже понял что Вы разбираетесь в Мутабельности не хуже меня, поэтому вполне могу забрать свои слова стартанувшие этот спор назад, надеюсь Вы удовлетворены
0
20 / 20 / 2
Регистрация: 01.11.2012
Сообщений: 66
15.11.2012, 15:35 15
Ну я, честно говоря, не вижу разницы, между присвоением параметру функции нового объекта или существующего (обмен). Суть остается та же, поменять ссылку объекта нельзя.
Ну и мне казалось очевидным, что w = new Object() - это попытка замены ссылки в примере.

А интерфейсы меня зацепили, конечно
Сейчас все кому не лень, ругают яву за перегруженность конструкций, фабрики фабрик и прочую "аппаратуру". Я не против, если это все юзается по мере необходимости. Но когда для обмена значений переменных создаются интерфейс, подклассы - меня это таки коробит. Ну да это действительно к теме не относится.

0
15.11.2012, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2012, 15:35
Помогаю со студенческими работами здесь

Реализация метода обмена значениями (Swap)
Здравствуйте. Начал недавно изучать c# и поставил себе задачу написать функцию swap. Но, не могу...

Перенос данных между документами без использования буфера обмена
Имеется word-файл-шаблон, в который вставлены DocVariable(ы), Холсты, Закладки и т.п.. В открытом...

Вывод формы для ручного выбора между двумя переменными
Ничего похожего не нашел. Подскажите, как вывести всплывающее окно с расположенными друг над...

Функция обмена для обменника
Всем доброго времени суток! Ребят, я уверен что тут есть люди которые занимаются трейдом игровых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru