Подтвердить что ты не робот

Как написать базовую функцию свопинга в Java

Я новичок в java. Как написать эквивалент java следующего кода C.

void Swap(int *p, int *q)
{
   int temp;
   temp = *p;
   *p = *q;
   *q = temp;
} 
4b9b3361

Ответ 1

Вот один трюк:

public static int getItself(int itself, int dummy)
{
    return itself;
}

public static void main(String[] args)
{
    int a = 10;
    int b = 20;

    a = getItself(b, b = a);
}

Ответ 2

Сортировка двух ints

Короткий ответ: вы не можете этого сделать, у java нет указателей.

Но вот что-то подобное, что вы можете сделать:

public void swap(AtomicInteger a, AtomicInteger b){
    // look mom, no tmp variables needed
    a.set(b.getAndSet(a.get()));
}

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

BTW: если ваши данные являются списком, лучшим способом обмена является использование Collections.swap(List, int, int):

Swaps the elements at the specified positions in the specified list.
(If the specified positions are equal, invoking this method leaves
the list unchanged.)

Parameters:
    list - The list in which to swap elements.
    i - the index of one element to be swapped.
    j - the index of the other element to be swapped. 

Сортировка массива int []

По-видимому, реальной целью является сортировка массива из int. Это однострочный с Arrays.sort(int[]):

int[] arr = {2,3,1,378,19,25};
Arrays.sort(arr);

Чтобы проверить вывод:

System.out.println(Arrays.toString(arr));
// [1, 2, 3, 19, 25, 378]

И вот простая вспомогательная функция для замены двух позиций в массиве ints:

public static void swap(final int[] arr, final int pos1, final int pos2){
    final int temp = arr[pos1];
    arr[pos1] = arr[pos2];
    arr[pos2] = temp;
}

Ответ 3

Здесь используется метод замены двух переменных в java только в одной строке с помощью побитового оператора XOR (^).

class Swap
{
   public static void main (String[] args)
   {
      int x = 5, y = 10;
      x = x ^ y ^ (y = x);
      System.out.println("New values of x and y are "+ x + ", " + y);
   }
} 

Вывод:

Новые значения x и y равны 10, 5

Ответ 4

Используйте этот однострочный слой для любого класса примитивных чисел, включая double и float:

a += (b - (b = a));

Например:

double a = 1.41;
double b = 0;
a += (b - (b = a));
System.out.println("a = " + a + ", b = " + b);

Вывод a = 0.0, b = 1.41

Ответ 5

В Java нет указателей. Однако каждая переменная, которая "содержит" объект, является ссылкой к этому объекту. Чтобы иметь выходные параметры, вам придется использовать объекты. В вашем случае объекты Integer.

Итак, вам нужно будет создать объект, который содержит целое число, и изменить это целое число. Вы не можете использовать класс Integer, поскольку он неизменен (т.е. Его значение не может быть изменено).

Альтернативой является возврат метода к массиву или парам int.

Ответ 6

Java использует pass-by-value. Метод не позволяет обменивать два примитива или объекты с помощью метода.

Хотя можно поменять местами два элемента в целочисленном массиве.

Ответ 7

Сниппет-1

public int[] swap1(int[] values) {
  if (values == null || values.length != 2)
    throw new IllegalArgumentException("parameter must be an array of size 2");
  int temp = values[0];
  values[0]=values[1];
  values[1]=temp;
  return values;
}

Сниппет-2

public Point swap2(java.awt.Point p) {
  if (p == null)
    throw new NullPointerException();
  int temp = p.x;
  p.x = p.y;
  p.y = temp;
  return p;
}

Использование:

int[] values = swap1(new int[]{x,y});
x = values[0];
y = values[1];

Point p = swap2(new Point(x,y));
x = p.x;
y = p.y;

Ответ 8

Вы не можете использовать ссылки в Java, поэтому функция свопинга невозможна, но вы можете использовать следующий фрагмент кода для каждого использования операций свопинга:

T t = p
p = q
q = t

где T - тип p и q

Однако замена изменяемых объектов может быть возможна путем перезаписи свойств:

void swap(Point a, Point b) {
  int tx = a.x, ty = a.y;
  a.x = b.x; a.y = b.y;
  b.x = t.x; b.y = t.y;
}

Ответ 9

Вы должны сделать это inline. Но вам действительно не нужен этот обмен на Java.

Ответ 10

В таких случаях существует быстрое и грязное решение с использованием массивов с одним элементом:

public void swap(int[] a, int[] b) {
  int temp = a[0];
  a[0] = b[0];
  b[0] = temp;
}

Конечно, ваш код тоже должен работать с этими массивами, что неудобно. Массивный трюк более полезен, если вы хотите изменить локальную конечную переменную из внутреннего класса:

public void test() {
  final int[] a = int[]{ 42 };  
  new Thread(new Runnable(){ public void run(){ a[0] += 10; }}).start();
  while(a[0] == 42) {
    System.out.println("waiting...");   
  }
  System.out.println(a[0]);   
} 

Ответ 11

Ваша функция подкачки существенно изменяет значения в двух частях памяти. Все, что ссылается на эти биты памяти, теперь получит разные значения.

В Java нет указателей, поэтому это не сработает. Вместо этого ссылки хранятся на объектах, и вы можете изменять вещи только внутри объектов. Если вам нужно ссылаться на один объект в двух местах, чтобы вы могли передавать одни и те же значения в системе и реагировать на них, попробуйте что-то вроде шаблон хранилища или инъекция зависимостей.

Мы можем только догадываться, зачем вам нужен этот код в C. Единственный совет, который я могу дать, - подумать об изменениях объектов, которые вы хотите достичь, предпочтительно добавить метод к реальным объектам, а не потянуть их внутренности и вызовите этот метод вместо этого. Если это вам не поможет, попробуйте отправить код вызова, так как мы, вероятно, будем иметь хорошее представление о том, как решить реальную проблему Java-стиля.

Ответ 12

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

Ответ 13

Как насчет могущественного IntHolder? Мне просто нравится любой пакет с omg в имени!

import org.omg.CORBA.IntHolder;

IntHolder a = new IntHolder(p);
IntHolder b = new IntHolder(q);

swap(a, b);

p = a.value;
q = b.value;

void swap(IntHolder a, IntHolder b) {
    int temp = a.value;
    a.value = b.value;
    b.value = temp;
}

Ответ 15

Вы можете легко написать его самостоятельно.

Дано:

int array[]={1,2};

:

int temp=array[0];
array[0]=array[1];
array[1]=temp;

И все готово. 3 строки кода.

Ответ 16

public class swaptemp {

public static void main(String[] args) {
    String s1="10";
    String s2="20";
    String temp;
    System.out.println(s1);
    System.out.println(s2);


   temp=Integer.toString(Integer.parseInt(s1));
    s1=Integer.toString(Integer.parseInt(s2));
    s2=Integer.toString(Integer.parseInt(temp));

System.out.println(s1);
System.out.println(s2);




}

}

Ответ 17

Переключение с помощью указателя возможно не в java. Однако вы можете реализовать swapping , передав массив, содержащий два объекта.

Код выглядит следующим образом:

public class Swap {
    public static void swap(String [] a){
        String temp;
        temp = a[0];
        a[0] = a[1];
        a[1] = temp;
    }
    public static void main(String [] args){
        String [] foo = new String[2];
        foo[0] = "str1";
        foo[1] = "str2";
        swap(foo);
        System.out.println("First value: "+ foo[0]);
        System.out.println("Second value: "+ foo[1]);
    }
}

Вывод:

First value: str2
Second value: str1

Ответ 18

//here is also another answer:
class SwapDemo{
    static int a=1, b=2 ;
    public static void main(String [] args){
        Swap swp = new Swap();
        swp.swaps(x,y);
        System.out.println( " a (was 1)now is " + a + " b (was 2) now is " + b);
    }
}
class Swap{
    void swaps(int c, int d){
            SwapDemo f = new SwapDemo();
            f.a = c;
            f.a = d;
        }
}

Ответ 19

  class Swap2Values{
    public static void main(String[] args){
       int a = 20, b = 10;

       //before swaping
       System.out.print("Before Swapping the values of a and b are: a = "+a+", b = "+b);

       //swapping
       a = a + b;
       b = a - b;
       a = a - b;

       //after swapping
      System.out.print("After Swapping the values of a and b are: a = "+a+", b = "+b);
    }
  }