【问题标题】:Return more than one variable from Java method从 Java 方法返回多个变量
【发布时间】:2012-08-11 16:29:19
【问题描述】:

对不起,愚蠢的问题... 谁能帮我从方法中返回两个变量(我读过here 并尝试重新编码但没有结果)。

public class FileQualityChecker {
    EnviroVars vars = new EnviroVars();  
    public int n = 0;
    public int z = 0;
    public int m = 0;
    String stringStatus;


    public void stringLenghtCheck(String pathToCheckedFile)
    {
        try{    
    FileInputStream fstream = new          FileInputStream(pathToCheckedFile+"\\"+"Test.dat");
         // Get the object of DataInputStream
         DataInputStream in = new DataInputStream(fstream);
         BufferedReader br = new BufferedReader(new InputStreamReader(in));
         String strLine;
          //Read File Line By Line
         while ((strLine = br.readLine()) != null)   
         {

           if  (
           strLine.length() == vars.strLenghtH ||
           strLine.length() == vars.strLenghtCUoriginal ||
           strLine.length() == vars.strLenghtCEAoriginal ||
           strLine.length() == vars.strLenghtCAoriginal ||
           strLine.length() == vars.strLenghtTrailer ||
           strLine.length() == vars.strLenghtLastRow 

           ) 
            {
               stringStatus = "ok";
               n++;
               z++; 

            }
           else 
           {
                stringStatus = "Fail";
                n++; 
                m++;
                }
           System.out.println (n +" " + strLine.length() +" " + stringStatus);
          }



         //Close the input stream
          in.close();
        }
        catch
        (Exception e){//Catch exception if any
         System.err.println("Error: " + e.getMessage());
         }

         /*How to return m and z from method to use these vars for writing in the file*/
         return (m, z);


        }

}

我需要另一个类中的 m 和 z 来将它们写入文件。谢谢。

【问题讨论】:

  • 我会尽可能将您的字段移动为局部变量。
  • 如果您正在阅读文本,请不要使用DataInputStream。
  • 请不要在您的代码中使用tab。我讨厌标签...完全不同的设置取决于您最喜欢的 IDE。只需使用空格即可。
  • @maba:天哪。使用标签!当您使用标签时,每个人都可以使用他/她最喜欢的标签宽度设置查看您的文件。使用空格,您可以将您的个人偏好强加给其他人。阅读:lea.verou.me/2012/01/why-tabs-are-clearly-superior。从不,从不使用空格缩进。真的。这是你可以想象的源代码中最烦人的事情。
  • 我认为 Tuples 是你可以研究的东西:stackoverflow.com/questions/2670982/using-tuples-in-java

标签: java methods return


【解决方案1】:

我对这类问题的第一个问题是,这两个结果之间有什么关系?

如果它们不相关,这是否表明您的方法做了两件不同的事情?

如果它们是相关的(在这种情况下它们似乎是相关的),则将它们包装在自定义对象中。这使您有机会稍后将更多结果添加到该对象中,并且您可以将行为附加到该对象。

您的另一个解决方案是将回调对象传递给此方法,因此您根本不返回任何内容,而是您的方法然后调用此对象上的方法,例如

// do some processing
callbackObject.furtherMethod(m, n);

这具有遵循 OO 原则的优点,即让对象为你做事,而不是向他们询问信息并自己做

【讨论】:

  • 它们是相关的。 “m”显示长度不正确的字符串数,z - 长度正确。
【解决方案2】:

创建一个单独的类并将 m 和 z 作为该对象中的变量,创建并填充该对象并返回该对象

class result {
  int m ; 
  int z ; 

// define getters and setters 
} 

public result stringLengthCheck(String pathToFile)
{

// your code 

result r = new result();
r.setM(m);
r.setZ(z);
return r ;
}

【讨论】:

  • 或者,如果可能,返回这些对象的数组。另一种有效的方法(虽然可能不是更可取)是使用类变量。该死的,你打败了我:P
【解决方案3】:

返回地图怎么样。 例如:

Map<String,Integer> result = new HashMap<String,Integer>();
result.put("ok",m);
result.put("fail",z);
return result;

你的方法应该改为:

public Map stringLenghtCheck(String pathToCheckedFile)

最后,你可以通过查看地图得到结果:

map.get("ok")
map.get("fail")

【讨论】:

  • +1 我会返回 Map&lt;String, Integer&gt; 而不是普通的地图。
  • 能否更详细地解释如何在另一个类中调用 result (map.get("ok") map.get("fail"))?
  • int 结果OK=map.get("ok"); int resultFail=map.get("失败");
【解决方案4】:

您不能从方法中返回多个变量。您需要返回其他内容。可以提出很多建议:

  1. 在你的方法所在的类中设置这些变量,然后访问它们(在这个类之外?)
    • 加:简单的符号,如setget
    • 另外:永远不要混淆变量
    • 减号:课堂上有些垃圾
  2. 返回带有变量的数组或列表
    • 加:存储简单
    • 另外:可以迭代数据
    • 减号:您可以轻松混淆变量(需要对变量位置进行约定)
    • 减号:额外的内存分配 - 存储少量变量时可能就足够了
  3. 返回一个包装器(包含所需变量的类的实例)
    • 另外:存储和读取简单
    • 另外:永远不要混淆变量
    • 减号:丑陋的代码(可能)如果包装器不常用
  4. 使用回调(如void setToArray(int[] array, args...)) - 与 1-3 点相同的 +/- 和

    • 加:内存分配减少是可能的
    • 减号:更丑陋的方法签名

    还有一些骇客(骇客 - 不适合临时案例!)也可能发生:

  5. 使用串联。您可以使用分隔符将多个字符串合二为一,也可以将两个整数存储为long

    • 所有可能的缺点,没有优点,但很有趣
  6. 使用InputStreamOutputStream
    • 另外:可以使用所有代码进行流处理(例如,存储/读取到文件)
    • 减号:不能随机访问数据
  7. 使用Iterator(我把它放在'hacks'下只是因为在很多方面它假设存储变量就像在包装器中)
    • 另外:可以迭代数据
    • 另外:可以避免额外的内存分配
    • 减号:不能随机访问数据
  8. 全部存储在String(或byte[])并在需要时解析
    • 加:String 可以任意传输
    • 减号:解析是一个昂贵的过程

为了存储两个整数PointDimension 类经常被使用。但对于给出的代码,我建议使用简单的数组或将变量存储在类 FileQualityChecker 中,因为 mz 似乎不适合坐标或维度上下文。

【讨论】:

    【解决方案5】:

    您可以创建自定义类或返回列表:

    return Arrays.asList(m, z);
    

    (你的方法的返回类型是List&lt;Integer&gt;

    或者在您的情况下,由于 mz 是类成员,您可以不返回任何内容 (void) 并提供 getter 以在方法返回后获取 mz 的值。

    【讨论】:

      【解决方案6】:

      不,你不能,但编写一个包含这些字段的类很容易:

      class StrAndInt {
         String str;
         int num;
      
         StrAndInt(String str, int num) {
             this.str = str;
             this.num = num;
         }
      }
      
      class MyApplication {
         ....
         ....
         StrAndInt myMethod() {
            ....
            ....
            return new StrAndInt("The value returned", 10);
         }
      

      【讨论】:

        【解决方案7】:

        另一种选择是不返回任何内容,因为您可以使用其他方法来获取这些字段中的结果。

        FileQualityChecker fqc = ..
        
        fqc.stringLenghtCheck(fileName);
        int okCount = fqc.getOkCount();
        int failedCount = fqc.getFailedCount();
        

        【讨论】:

          【解决方案8】:

          我不认为你可以从一个方法返回两个变量,因为一个方法只能有一个返回类型。所以 IMO 你有两个选择:

          1) 创建一个具有相同类型变量的类,并为您在该类中定义的那些变量生成 getter-setter。现在从要返回变量的方法创建该类的对象,并使用 setter 将实例变量的值设置为要返回的变量的值返回该对象。

          2) 创建一个包含这些变量的数组并返回该数组。

          【讨论】:

            【解决方案9】:

            1.我希望mn 使用传递值。 2. 改为使用引用传递。要在Java 中执行引用传递,它必须是Java 对象。 3.所以创建新的Integer对象m=new Integer();.

            【讨论】:

              【解决方案10】:

              您可以将这两个变量放在int[] 中,并在调用该方法时提取这两个值。

              return new Integer[]{m, z};
              

              调用方法后:

              Integer[] array = Foo.method();
              int m = array[0];
              int z = array[1];
              

              【讨论】:

                【解决方案11】:

                你可以简单地构造一个对象。

                但是,如果您必须返回多个变量,则可以返回一个类型相似的变量数组,示例如下:

                public static StringBuilder[] remedySBarrayreturner() {
                    sbbb.append("huhu");
                    sbcc.append("hihi");
                    return new StringBuilder[] {sbbb, sbcc};
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-05-12
                  • 2015-12-16
                  • 2014-12-22
                  • 2019-12-03
                  • 1970-01-01
                  • 2012-09-20
                  • 2017-08-30
                  相关资源
                  最近更新 更多