как поменять два объекта-обертки Integer - PullRequest
2 голосов
/ 23 ноября 2011

Как мне поменять содержимое двух упаковщиков Integer?

void swap(Integer a,Integer b){
   /*We can't use this as it will not reflect in calling program,and i know why
    Integer c = a;
    a= b;
    b = c;
   */
  //how can i swap them ? Does Integer has some setValue kind of method?
  //if yes
    int c = a;
    a.setValue(b);
    b.setValue(c);

}

Ответы [ 6 ]

2 голосов
/ 23 ноября 2011

Вы не можете, именно потому, что Integer является неизменным (наряду с другими примитивными типами обёрток). Если бы у вас был изменяемый класс-обертка, было бы хорошо:

public final class MutableInteger {
{
    private int value;

    public MutableInteger(int value) {
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

void swap(MutableInteger a, MutableInteger b) {
    int c = a.getValue();
    a.setValue(b.getValue());
    b.setValue(c); 
}

Однако из-за отсутствия эквивалента setValue в Integer, в принципе, нет способа выполнить то, что вы просите. Это хорошо. Это означает, что для большинства случаев, когда мы можем захотеть передать значение Integer другому методу, нам не нужно беспокоиться о том, является ли метод будет мутировать его. Неизменность делает рассуждение о вашем коде намного проще, без необходимости тщательно отслеживать, что делает каждый метод, на случай, если он изменит ваши данные под вашими ногами.

1 голос
/ 23 ноября 2011

Тип java.lang.Integer представляет собой неизменное число, которое никогда не изменит свое значение.Если вам нужен номер mutable , попробуйте MutableInt от Apache Commons.

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

public static void swap(Integer[] ints, int index1, int index2) {
  Integer tmp = ints[index1];
  ints[index1] = ints[index2];
  ints[index2] = tmp;
}

Вы можете написать подобный код, используя List<T>, но вам всегда нужен контейнер (или два), в котором вы можете поменяться местами.

1 голос
/ 23 ноября 2011

Типы оболочек в Java являются неизменяемыми, поэтому не предоставляют методов установки.Плюс Java работает, передавая ссылки по значению.Можете ли вы сказать нам, почему вы хотите поменяться местами?

0 голосов
/ 23 ноября 2011
public class NewInteger {
    private int a;
    private int b;

    public int getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public NewInteger(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void swap(){
        int c = this.a;
        this.a = this.b;
        this.b = c;
    }
}


NewInteger obj = new NewInteger(1, 2);
System.out.println(obj.getA());
System.out.println(obj.getB());
obj.swap();
System.out.println(obj.getA());
System.out.println(obj.getB());

выход: 1 2 2 1

0 голосов
/ 23 ноября 2011

вы можете попробовать что-то вроде этого:

class MyClass{
int a = 10 , b = 20;
public void swap(MyClass obj){
    int c;
    c = obj.a;
    obj.a = obj.b;
    obj.b = c;
}
public static void main(String a[]){
    MyClass obj = new MyClass();
    System.out.println("a : "+obj.a);
    System.out.println("b : "+obj.b);
    obj.swap(obj);
    System.out.println("new a : "+obj.a);
    System.out.println("new b : "+obj.b);
}
}
0 голосов
/ 23 ноября 2011

Обратитесь к этой статье, чтобы получить четкое представление Статья

Вы получите четкое представление о передаче по значению по ссылке и ее концепции

...