从Java方法返回多个变量
抱歉愚蠢的问题……任何人都可以帮我从方法中返回两个变量(我在这里阅读并尝试重新编码,但没有结果)。
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将它们写入文件。 谢谢。
我对这些问题的第一个问题是,这两个结果之间的关系是什么?
如果它们不相关,这是否指向您的方法做两件不同的事情?
如果它们相关(它们似乎是这种情况),则将它们包装在自定义对象中。 这使您有机会稍后在此对象中添加更多结果, 并且可以将行为附加到此对象。
您的另一个解决方案是将回调对象传递给此方法,因此您根本不返回任何内容,而是您的方法然后调用此对象上的方法,例如
// do some processing callbackObject.furtherMethod(m, n);
这样做的好处是遵循OO原则, 让对象为您做事,而不是向他们询问信息并自己做 。
创建一个单独的类,并将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 ; }
如何返回地图。 例如:
Map result = new HashMap(); result.put("ok",m); result.put("fail",z); return result;
并且您的方法应更改为:
public Map stringLenghtCheck(String pathToCheckedFile)
最后,您可以通过查看地图获得结果:
map.get("ok") map.get("fail")
您不能从方法返回多个变量。 你需要返回别的东西。 有很多建议可以发生:
- 在你的方法所在的类中设置这些变量,然后访问它们(在这个类之外?)
- 加:简单的符号,如
set
和get
- 加:永远不要混淆你的变量
- 减:课堂上有些垃圾
- 加:简单的符号,如
- 返回带变量的数组或列表
- 加:存储简单
- 加:迭代数据的可能性
- 减:您可以轻松混淆变量(需要关于变量位置的约定)
- 减:额外的内存分配 – 在存储少量变量时可能就足够了
- 返回一个包装器(包含所需变量的类的实例)
- 加上:存储和阅读的简单性
- 加:永远不要混淆你的变量
- 减:丑陋的代码(可能)如果不经常使用包装器
-
使用回调(如
void setToArray(int[] array, args...)
) – 相同的+/- 1-3点说和- 加:内存分配减少是可能的
- 减:更难看的方法签名
还有一些黑客(黑客 – 不是偶然的情况!)也可以发生:
-
使用连接。 您可以使用分隔符将多个字符串连接在一起,或者在long中存储两个整数
- 所有可能的弊端,没有优点,但有趣
- 使用
InputStream
和OutputStream
- plus:使用流处理的所有代码的可能性(例如,存储/读取到文件)
- 减:没有随机访问数据
- 使用
Iterator
(我把它放在’hacks’之下只是因为在很多方面它假定存储变量就像在包装器中一样)- 加:迭代数据的可能性
- 加:避免额外内存分配的可能性
- 减:没有随机访问数据
- 将所有内容存储在
String
(或byte[]
)中并在需要时解析- plus:无论如何都可以传输
String
- 减:解析是一个昂贵的过程
- plus:无论如何都可以传输
对于存储两个整数,经常使用Point
和Dimension
类。 但是对于给出的代码,我建议使用简单的数组或在FileQualityChecker
类中存储变量,因为m
和z
似乎不适合坐标或维度上下文。
您可以创建自定义类或返回列表:
return Arrays.asList(m, z);
(您的方法的返回类型将是List
)
或者在你的情况下,由于m
和z
是类成员,你可以返回任何内容(void)并提供getter以在方法返回后获取m
和z
的值。
不,你不能,但写一个包含这些字段的类很容易:
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); }
另一种选择是不返回任何内容,因为您可以使用其他方法获取这些结果。
FileQualityChecker fqc = .. fqc.stringLenghtCheck(fileName); int okCount = fqc.getOkCount(); int failedCount = fqc.getFailedCount();
我不认为你可以从方法返回两个变量,因为一个方法只能有一个返回类型。 所以IMO你有两个选择:
1)创建一个具有相同类型变量的类,并为您在该类中定义的变量生成getter-setter。 现在,从要返回的方法返回变量,创建该类的对象,并使用setter设置实例变量的值,并使用要返回的变量的值返回该对象。
2)创建这些变量的数组并返回该数组。
我希望m
和n
使用pass by值 。 2.Instead使用Pass by Reference.To在Java中通过引用传递 ,它必须是一个Java对象。 3.因此创建新的Integer对象m = new Integer(); 。
您可以将两个变量放在int[]
并在调用方法时提取这两个值。
return new Integer[]{m, z};
调用方法后:
Integer[] array = Foo.method(); int m = array[0]; int z = array[1];
你可以简单地构造一个对象。
但是,如果必须返回多个变量,则可以返回类似类型变量的数组,例如:
public static StringBuilder[] remedySBarrayreturner() { sbbb.append("huhu"); sbcc.append("hihi"); return new StringBuilder[] {sbbb, sbcc}; }