web-dev-qa-db-ja.com

1つのメソッドから2つの変数を返します

次のコードを正しく書く方法は?

public String toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);

    return (postn, movm);
}

次のエラーが発生しました

movm cannot be returned.
11
Lbert Hartanto

Java 8を使用する場合、 Pair クラスを使用できます。

private static Pair<String, String> foo (/* some params */) {
    final String val1 = "";  // some calculation
    final String val2 = "";  // some other calculation

    return new Pair<>(val1, val2);
}

それ以外の場合は、単に配列を返します。

30
ifloop

このシナリオを実装するために考えられる4つの方法があります。

1.クラスを使用する

あなたが返すことができるすべての属性を持つクラスを作成します

public class Sample {
   private String postn;
   private String movm;
   public String getPostn() {
        return postn;
   }
   public void setPostn(String postn) {
    this.postn = postn;
   }
   public String getMovm() {
       return movm;
   }
   public void setMovm(String movm) {
       this.movm = movm;
   }    
}

メソッドを変更してこのクラスのオブジェクトを含め、これらの属性に値を設定します。メソッドの戻り値の型をクラス名に変更します。サンプル

public Sample toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    Sample obj = new Sample();
    obj.setPostn(postn);
    obj.setMovm(movm);
    return obj;
}

2.配列を使用する

String配列を返すようにメソッドを変更し、その配列に値を保存します。

public String[] toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    String arr[] = new String[2];
    arr[0] = postn;
    arr[1] = movm;
    return arr;
}

3. javatuplesの使用

リンクで詳細を読むことができます http://www.javatuples.org/

4.データを区切る

変数内のデータについて確信がある場合は、区切り文字を使用できます。ただし、これらの値を使用する場合は、区切り文字を1回試す必要があります。

public String toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    return postn+"~"+movm;
}
4
Ashu

Javaのメソッドで2つの異なる値を返すことはできません。

この必要性が発生した場合、通常2つのオプションがあります。

  1. 返すタイプを持つクラスを作成し、そのクラスのインスタンスを返します。通常、これらのクラスは非常に基本的であり、パブリックメンバーと、オプションで必要なすべての値でインスタンスを開始するコンストラクターが含まれます。
  2. 参照型オブジェクトをパラメーターとしてメソッドに追加し、メソッドが返す値でメソッドを変更します。あなたの例では文字列を使用しているため、Java文字列は不変なので、これは機能しません。

別のオプションは、両方の戻り値の型が文字列であるため、文字列の配列を使用することです。このオプションを戻り値として使用することも、メソッドによって変更されるパラメーターとして使用することもできます。

編集:通常、「toString」メソッドは文字列を1つだけ返します。おそらく、セパレータを使用して両方の文字列を1つの文字列に連結することを検討する必要があります。例:

return postn + "_" + movm;
4
Gil Moshayof

Javaでは、関数が複数の値を返すようにするには、

  • 返されるオブジェクトにそれらの値を埋め込みます
  • または、関数に渡されるオブジェクトを変更します〜 dystroy

ここには2つのオプション(私が知っている)があります。

オプション1:新しい配列として返す:

 public String[] toString(int[] position,int xOffset,int yOffset) {
        String postn=String.format("[%d,%d]",position[0],position[1]);
        String movm=String.format("[%d,%d]",xOffset,yOffset);

        string [] myArray = new string[2];
        myArray[0] = postn;
        myArray[1] = movm;

        return myarray; //returns as array
     }

オプション2:そのまま返す

get setを表示するように編集されました

    private String a;
    private String b;

    public void setPostN(String s)
    {
            a= s;
    }

    public String getPostN()
    {
            return a;
    }

    public void setMovm(String s)
    {
            a= s;
    }

    public String getMovm() 
    {
            return a;
    }

あなたの方法で:

public void toString(int[] position,int xOffset,int yOffset) {
        String postn=String.format("[%d,%d]",position[0],position[1]);
        String movm=String.format("[%d,%d]",xOffset,yOffset);

        setPostN(postn);
        setMovm(movm);

       //no return, but available via calling getMovm() or getPostN()
     }
2
user3913686

ラッパータイプを作成し、インスタンス化して返すか、MapまたはList/Arrayを返すことができます。

1
Kent