it-swarm.com.de

Wie schreibe ich eine grundlegende Swap-Funktion in Java

Ich bin neu in Java. Wie schreibt man das Java Äquivalent des folgenden C-Codes?.

void Swap(int *p, int *q)
{
   int temp;
   temp = *p;
   *p = *q;
   *q = temp;
} 
52
Melinda

Hier ist ein Trick:

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);
}
84
Eng.Fouad

Zwei Ints sortieren

Die kurze Antwort lautet: Das können Sie nicht, Java hat keine Zeiger.

Aber hier ist etwas Ähnliches, das Sie tun können:

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

Sie können dies mit allen Arten von Containerobjekten tun (wie Sammlungen und Arrays oder benutzerdefinierte Objekte mit einer int-Eigenschaft), aber nur nicht mit Primitiven und ihren Wrappern (weil sie alle unveränderlich sind). Aber der einzige Weg, es zu einem Einzeiler zu machen, ist mit AtomicInteger, denke ich.

Übrigens: Wenn es sich bei Ihren Daten um eine Liste handelt, können Sie diese besser mit Collections.swap(List, int, int) tauschen:

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. 

Sortieren eines int [] Arrays

anscheinend ist das eigentliche Ziel, eine Reihe von Ints zu sortieren. Das ist ein Einzeiler mit Arrays.sort(int[]) :

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

So überprüfen Sie die Ausgabe:

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

Und hier ist eine einfache Hilfsfunktion, um zwei Positionen in einem Array von Ints zu vertauschen:

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;
}
39

Hier ist eine Methode, um zwei Variablen in Java in nur einer Zeile mit dem bitweisen XOR (^) Operator zu tauschen.

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);
   }
} 

Ausgabe:

Neue Werte von x und y sind 10, 5

36
Prateek Joshi

Verwenden Sie diesen Einzeiler für alle primitiven Zahlenklassen, einschließlich double und float:

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

Beispielsweise:

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

Ausgabe ist a = 0.0, b = 1.41

9
Oleg Mikhailov

In Java gibt es keine Zeiger. Jede Variable, die ein Objekt "enthält", ist jedoch ein Verweis auf dieses Objekt. Um Ausgabeparameter zu haben, müssten Sie Objekte verwenden. In Ihrem Fall sind Integer-Objekte.

Sie müssten also ein Objekt erstellen, das eine Ganzzahl enthält, und diese Ganzzahl ändern. Sie können die Integer-Klasse nicht verwenden, da sie unveränderlich ist (d. H. Ihr Wert kann nicht geändert werden).

Eine Alternative besteht darin, die Methode ein Array oder ein Paar von Ints zurückgeben zu lassen.

4
Sjoerd

Was ist mit dem mächtigen IntHolder? Ich liebe jedes Paket mit Omg im Namen!

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;
}
3
PowerApp101

Java verwendet Pass-by-Value . Es ist nicht möglich, zwei Primitive oder Objekte mit einer Methode zu tauschen.

Es ist zwar möglich, zwei Elemente in einem Integer-Array zu vertauschen.

2
codaddict

In solchen Fällen gibt es eine schnelle und schmutzige Lösung, wenn Arrays mit einem Element verwendet werden:

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

Natürlich muss Ihr Code auch mit diesen Arrays funktionieren, was unpraktisch ist. Der Array-Trick ist nützlicher, wenn Sie eine lokale endgültige Variable aus einer inneren Klasse ändern möchten:

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]);   
} 
2
Landei

Snippet-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;
}

Snippet-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;
}

Verwendung:

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;
2
Andreas_D

Java wird als Wert übergeben. Also ist das swap in dem Sinne, wie Sie es meinen, nicht möglich. Sie können jedoch den Inhalt von zwei Objekten austauschen oder dies inline tun.

1
fastcodejava

Sie können in Java keine Referenzen verwenden, daher ist eine Auslagerungsfunktion nicht möglich. Sie können jedoch für jede Verwendung von Auslagerungsoperationen den folgenden Codeausschnitt verwenden:

T t = p
p = q
q = t

wobei T die Art von p und q ist

Das Austauschen von veränderlichen Objekten kann jedoch durch Umschreiben von Eigenschaften möglich sein:

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;
}
1
Ming-Tang

Sie müssen es inline tun. Aber Sie brauchen diesen Swap in Java wirklich nicht.

1
Bart

Sie können Variablen mit oder ohne Verwendung einer temporären Variablen austauschen.

In diesem Artikel werden mehrere Methoden zum Austauschen von Zahlen ohne temporäre Variable bereitgestellt:

http://topjavatutorial.com/Java/java-programs/swap-two-numbers-without-a-temporary-variable-in-Java/

1
Sekhar Ray

Ihre Swap-Funktion ändert im Wesentlichen die Werte in zwei Teilen des Speichers. Alles, was auf diese Speicherbits verweist, erhält jetzt andere Werte.

In Java gibt es keine wirklichen Zeiger, daher funktioniert dies nicht. Stattdessen werden Verweise auf Objekte gespeichert, und Sie können nur Dinge innerhalb der Objekte ändern. Wenn Sie auf ein Objekt verweisen müssen Versuchen Sie an zwei Stellen Folgendes: das Repository-Muster oder Abhängigkeitsinjektion , damit Sie dieselben Werte im System übergeben und darauf reagieren können.

Wir können nur raten, warum Sie diesen Code in C benötigt haben. Der einzige Rat, den ich geben kann, besteht darin, über die Änderungen an den Objekten nachzudenken, die Sie erreichen möchten. Fügen Sie vorzugsweise eine Methode zu den tatsächlichen Objekten hinzu, anstatt deren Interna herauszuziehen, und Rufen Sie stattdessen diese Methode auf. Wenn dies nicht hilft, geben Sie den aufrufenden Code ein, da wir wahrscheinlich eine gute Vorstellung davon haben, wie das eigentliche Problem im Java-Stil gelöst werden kann.

1
Lunivore
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);
    }
}
0
user5962065

Das Austauschen mit Zeiger ist in Java nicht möglich. Allerdings, Sie können das Austauschen implementieren durch Übergeben eines Arrays, das zwei Objekte enthält.

Code geht so:

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]);
    }
}

Ausgabe:

First value: str2
Second value: str1
0
Nabin Bhandari

Sie können leicht selbst schreiben.

gegeben:

int array[]={1,2};

sie machen:

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

Und du bist fertig. Codezeilen.

0
Yunus Seçgin