2

愚かな質問で申し訳ありません...誰かがメソッドから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

この種の問題に関する私の最初の質問は、これら 2 つの結果の関係は何ですか?

それらが無関係である場合、それはあなたのメソッドが2つの異なることをしていることを示していますか?

それらが関連している場合 (この場合は関連しているように見えます)、それらをカスタム オブジェクトでラップします。これにより、後でこのオブジェクトにさらに結果を追加する機会が得られ、このオブジェクトに動作を追加できます。

あなたの他の解決策は、コールバックオブジェクトをこのメソッドに渡すことです。そのため、何も返さずに、メソッドがこのオブジェクトのメソッドを呼び出します。

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

これには、オブジェクトに情報を求めて自分で行うのではなく、オブジェクトに何かをさせるというオブジェクト指向の原則に従うという利点があります。

于 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. メソッドがあるクラスでこれらの変数を設定し、それらにアクセスします(このクラスの外ですか?)
    • プラス: setandのような簡単な表記法get
    • プラス:変数を混同しないでください
    • マイナス:クラスのゴミ
  2. 変数を含む配列またはリストを返す
    • プラス:保管のシンプルさ
    • プラス:データを反復する可能性
    • マイナス:変数を簡単に混同できます(変数の場所についての慣例が必要です)
    • マイナス: 余分なメモリ割り当て - いくつかの変数を保存する場合は十分かもしれません
  3. ラッパーを返す (必要な変数を含むクラスのインスタンス)
    • プラス:保存と読み取りのシンプルさ
    • プラス:変数を混同しないでください
    • マイナス: ラッパーが頻繁に使用されない場合、醜いコード (おそらく)
  4. コールバックを使用します(のようにvoid setToArray(int[] array, args...))-1〜3ポイントが言うのと同じ+/-

    • プラス: メモリ割り当ての削減が可能
    • マイナス:より醜いメソッドシグネチャ

    また、いくつかのハッキング (ハック - カジュアルな場合ではありません!) も発生する可能性があります。

  5. 連結を使用します。区切り文字を使用して複数の文字列を 1 つに結合したり、2 つの整数を long に格納したりできます

    • すべての可能なマイナス、プラスはありませんが、面白い
  6. 使用InputStreamしてOutputStream
    • プラス: ストリーム処理のためのすべてのコードの使用の可能性 (たとえば、ファイルへの保存/読み取り)
    • マイナス: データへのランダムアクセスなし
  7. 使用Iterator(多くの点で、ラッパーのように変数を格納することを想定しているため、「ハック」の下に配置しました)
    • プラス:データを反復する可能性
    • プラス: 余分なメモリ割り当てを回避する可能性
    • マイナス: データへのランダムアクセスなし
  8. Stringすべてを(または)に格納し、byte[]必要に応じて解析する
    • プラス:Stringとにかく送信できます
    • マイナス:解析は高価な手順です

2 つの整数PointDimensionクラスを格納するためによく使用されます。しかし、指定されたコードについては、単純な配列の使用または変数を classFileQualityCheckerに格納すること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 を提供してmandの値を取得できます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 つしか持てないため、メソッドから 2 つの変数を返すことはできないと思います。したがって、IMOには2つのオプションがあります。

1) 同じタイプの変数を持つクラスを作成し、そのクラスで定義した変数の getter-setter を生成します。ここで、変数を返したいメソッドからそのクラスのオブジェクトを作成し、セッターを使用してインスタンス変数の値を、返したい変数の値で設定し、そのオブジェクトを返します。

2) これらの変数の配列を作成し、その配列を返します。

于 2012-08-15T11:40:37.733 に答える
0

1.値渡しを希望mしてn 使用します。2.代わりに参照渡しを使用します。Javaで参照渡しを行うには、Javaオブジェクトである必要があります。3.新しい整数オブジェクトを作成しますm=new Integer(); .

于 2014-01-09T21:10:09.633 に答える