【问题标题】:return two variables from one method从一个方法返回两个变量
【发布时间】:2014-12-22 12:32:04
【问题描述】:

如何正确编写以下代码?

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、2 个字符串的数组、2 个项的集合、将容器作为参数传递等。
  • 以数组形式返回。所以你的方法签名将是public String[].....。另外,@Reimeus 回答了它.....
  • 在 Java 中,您只能返回一个变量/对象。如果你想返回两个字符串对象。我建议你把它们放在一个数组、列表或集合中,然后通过返回那个对象。

标签: java string variables methods return


【解决方案1】:

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

否则只返回一个数组。

【讨论】:

【解决方案2】:

Java 中的方法不能返回两个不同的值。

当这种需要发生时,您通常有两种选择:

  1. 创建一个具有您想要返回的类型的类,然后返回该类的一个实例。通常这些类是非常基本的,包含公共成员和可选的构造函数来启动具有所有必需值的实例。
  2. 将引用类型对象作为参数添加到方法中,该方法将使用您想要返回的值进行变异。在您的示例中,您使用字符串,因此这将不起作用,因为在 Java 中字符串是不可变的。

另一种选择是使用字符串数组,因为您的两种返回类型都是字符串。您可以将此选项用作返回值,或由方法更改的参数。

编辑: 通常“toString”方法只返回一个字符串。也许您应该考虑使用一些分隔符将两个字符串连接成一个字符串。示例:

return postn + "_" + movm;

【讨论】:

    【解决方案3】:

    我可以想到四种方法来实现这个场景:

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

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

    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。使用 javatuple

    您可以在链接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;
    }
    

    【讨论】:

      【解决方案4】:

      在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:原样返回

      已编辑以显示设置

          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#。
      • 很好的插图,但也许你想调用你的类 Obj 而不是 obj 并写出 getter 和 setter 方法来获得一个可编译的例子:)
      • 感谢您的 cmets,@Henrik 这可能是因为 java/c# 非常相似(而且我使用 99% c# :P)
      • ObjClass 看起来很 CShapry。这个问题是关于 Java 的,因为它是一个非常基本的问题,所以这个答案可能会非常令人困惑。
      • 只公开它们可能就足够了 :)
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 2010-11-30
        • 2012-01-17
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多