2

抱歉这个愚蠢的问题......有人可以帮我从方法中返回两个变量吗(我在这里阅读 并尝试重新编码但没有结果)。

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 将它们写入文件。谢谢你。

4

11 回答 11

10

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

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

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

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

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

这样做的好处是遵循 OO 原则,让对象为您做事,而不是向他们询问信息并自己做

于 2012-08-15T11:19:19.703 回答
6

创建一个单独的类并将 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 ;
}
于 2012-08-15T11:12:44.333 回答
4

如何返回地图。例如:

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")
于 2012-08-15T12:12:24.607 回答
4

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

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

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

    并且一些黑客(黑客 - 不适合临时案例!)也可能发生:

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

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

经常使用存储两个整数Point和类。Dimension但是对于给定的代码,我建议使用简单的数组或在 class 中存储变量FileQualityChecker,因为m并且z似乎不适合坐标或维度上下文。

于 2013-12-02T12:07:38.643 回答
1

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

FileQualityChecker fqc = ..

fqc.stringLenghtCheck(fileName);
int okCount = fqc.getOkCount();
int failedCount = fqc.getFailedCount();
于 2012-08-15T12:16:19.133 回答
1

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

return Arrays.asList(m, z);

(您的方法的返回类型是List<Integer>

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

于 2012-08-15T11:14:58.613 回答
1

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

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);
   }
于 2012-08-15T11:15:02.647 回答
0

1.我希望mn 使用价值观传递。2.而不是使用引用传递。要在Java中通过引用传递,它必须是Java对象。3.所以创建新的整数对象m=new Integer(); .

于 2014-01-09T21:10:09.633 回答
0

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

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

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

于 2012-08-15T11:40:37.733 回答
0

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

return new Integer[]{m, z};

调用方法后:

Integer[] array = Foo.method();
int m = array[0];
int z = array[1];
于 2014-04-19T05:48:10.920 回答
0

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

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

public static StringBuilder[] remedySBarrayreturner() {
    sbbb.append("huhu");
    sbcc.append("hihi");
    return new StringBuilder[] {sbbb, sbcc};
}
于 2015-05-31T01:23:22.147 回答