从一个方法中返回两个变量

12

如何正确地编写以下代码?

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.

你好。可以返回Map.Entry<String, String>、包含2个字符串的数组、包含2个元素的集合、将容器作为参数传递等等。 - nndru
返回一个数组。因此,您的方法签名将为public String[].....。另外,@Reimeus已经回答了它..... - ha9u63a7
请参考此链接:https://dev59.com/43E85IYBdhLWcg3wVR2g - Rajarshi Goswami
在Java中,你只能返回一个变量/对象。如果你想返回两个字符串对象,我建议你将它们放入数组、列表或集合中,然后返回该对象。 - User27854
5个回答

33

使用 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);
}
否则只需返回一个数组。

pair classjavafx 的一部分。我们能在标准版 (SE) 中使用吗? - Subhrajyoti Majumder
从JDK 7u6开始,JavaFX已经包括在标准的JDK和JRE捆绑包中。 - ifloop
@DavidM。我同意你的观点。特别是在期待Java9模块化的时候,可能会遇到没有UI模块安装的运行时。使用数组或简单的POJO类可能更加优雅。 - ifloop

4
在Java中,方法无法返回两个不同的值。
当需要这样做时,通常有两个选项:
1.创建一个包含您想要返回的类型的类,然后返回该类的实例。通常,这些类非常基本,包含公共成员和可选构造函数以使用所有必需的值初始化实例。
2.将引用类型对象作为参数添加到方法中,该方法将使用您想要返回的值对其进行更改。在您的示例中,您使用字符串,因此这种方法不起作用,因为在Java中字符串是不可变的。
另一个选择是使用字符串数组,因为您的返回类型都是字符串。您可以将其用作返回值或由方法修改的参数。
编辑:通常,“toString”方法只返回一个字符串。也许您应该考虑使用某种分隔符将您的两个字符串连接到一个字符串中。例如:
return postn + "_" + movm;

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

并且更改你的方法,将该类的对象包含在其中,并设置这些属性的值。将方法的返回类型更改为类名,例如Sample。

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. 使用数组

将方法更改为返回字符串数组,并将值存储在该数组中:

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. 通过分隔数据

如果您对变量中的数据确信无疑,可以使用一些分隔符。但是当您想要使用这些值时,需要使用该分隔符进行拆分。

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

2
在Java中,当你想让一个函数返回多个值时,你必须将这些值嵌入到你返回的对象中,或者改变一个传递给你的函数的对象(如dystroy所述)。
你有两个选项(据我所知):
选项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()
     }

obj 似乎主要是 C#。 - Henrik Aasted Sørensen
不错的图示,但是也许你想把你的类名改为 Obj 而不是 obj,并且写出 getter 和 setter 方法以得到一个可编译的示例 :) - GameDroids
感谢您的评论,@Henrik。这可能是因为Java/C#非常相似(再加上我99%的工作都是用C# :P)。 - user3913686
1
ObjClass看起来非常像C#。这个问题是关于Java的,由于它是一个非常基础的问题,所以这个答案可能非常令人困惑。 - Gil Moshayof
只是将它们公开可能已经足够了 :) - Gil Moshayof
没错,但我这样做是为了物理显示它的含义。 - user3913686

1

你可以创建一个包装类型,实例化并返回它,或者返回一个Map或List/Array。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接