web-dev-qa-db-ja.com

Javaで基本的なスワップ関数を書く方法

私はJavaが初めてです。 Java以下のCコードと同等の記述方法。

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

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

2つのintの並べ替え

簡単な答えは、それはできません。Javaにはポインターがありません。

ただし、次のようなことができます。

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

これは、すべての種類のコンテナオブジェクト(コレクションや配列、またはintプロパティを持つカスタムオブジェクトなど)で実行できますが、プリミティブとそのラッパーでは実行できません(すべて不変であるため)。しかし、それをワンライナーにする唯一の方法は、AtomicIntegerを使用することです。

ところで:あなたのデータがたまたまリストである場合、スワップするより良い方法は 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[]) の1行です。

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

出力を確認するには:

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

そして、intの配列内の2つの位置を交換する簡単なヘルパー関数を次に示します。

_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

Java 1行のみビット単位のXOR(^)演算子を使用して2つの変数を交換する方法を次に示します。

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です

36
Prateek Joshi

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

9
Oleg Mikhailov

Javaにはポインターはありません。ただし、オブジェクトを「含む」すべての変数は、そのオブジェクトへの参照です。出力パラメーターを使用するには、オブジェクトを使用する必要があります。 あなたの場合、整数オブジェクト。

したがって、整数を含むオブジェクトを作成し、その整数を変更する必要があります。 Integerクラスは不変であるため、使用できません(つまり、値を変更することはできません)。

別の方法は、メソッドが配列またはintのペアを返すようにすることです。

4
Sjoerd

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

Javaはpass-by-valueを使用します。メソッドを使用して2つのプリミティブor objectsを交換することはできません。

整数配列内の2つの要素を交換することは可能ですが。

2
codaddict

そのような場合、1つの要素を持つ配列を使用した迅速で汚い解決策があります。

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

もちろん、コードもこれらの配列で動作する必要があり、これは不便です。配列トリックは、内部クラスからローカルのfinal変数を変更する場合に便利です。

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

スニペット-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;
2
Andreas_D

Javaは値渡しです。したがって、swapは、あなたが意味する意味では不可能です。ただし、2つのオブジェクトの内容を交換することも、インラインで実行することもできます。

1
fastcodejava

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

インラインで行う必要があります。しかし、Javaでそのスワップは本当に必要ありません。

1
Bart

一時変数を使用して、または使用せずに変数を交換できます。

以下は、temp変数なしで数値を交換するための複数の方法を提供する記事です。

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

1
Sekhar Ray

スワップ関数は、基本的に2つのメモリの値を変更しています。これらのメモリのビットを参照するものはすべて異なる値を取得します。

In Java実際にはポインタがないため、これは機能しません。代わりに、オブジェクト上の参照が保持され、オブジェクト内の内容のみを変更できます。1つのオブジェクトを参照する必要がある場合2つの場所で、システム全体に同じ値を渡し、変化に対応させるために、 リポジトリパターン または 依存性注入 のようなものを試してください。

Cでこのコードが必要な理由を推測することしかできません。私ができる唯一のアドバイスは、達成したいオブジェクトの変更について考えることです。できれば、内部を引き出すのではなく、実際のオブジェクトにメソッドを追加してください代わりにそのメソッドを呼び出してください。これが役に立たない場合は、呼び出しコードを投稿してみてください。実際の問題であるJavaスタイルを解決する方法について、おそらく良いアイデアがあるでしょう。

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

pointerを使用したスワッピングは、Javaではnotで可能です。 ただし、2つのオブジェクトを含むスワッピングを実装できます配列を渡すこと

コードは次のようになります。

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
0
Nabin Bhandari

自分で簡単に作成できます。

与えられた:

int array[]={1,2};

あなたがやる:

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

これで完了です。 行のコード

0
Yunus Seçgin