2012-01-16 10 views
2

複数のメソッドに文字列の配列を渡すことです私は、文字列配列を持っています。 String[] strArr = ...。今私はそれを処理し、結果を取得したいので、私のような引数としてString配列を取る方法を作った、Javaのコーディングスタイル - Javaの?:</p> <p>でこの良いコーディングが何度も何度も

public bopolen processArray(String[] srtArr){ 
    // .... some processing 
    // loop over string array, process it and create a 
    // list of objects with same size as array 
    List<Object> objList = new ArrayList<Object>(strArr.length); 
    for(String str : strArr) { 
     String[] anotherStrArr = str.split(","); 
     Object myObj = new MyObject(anotherStrArr[0],anotherStrArr[1]); 
     objList.add(myObj); 
    } 
    // .... some more processing 
    // .... 
    // loop over list and call another method 
    // that also takes an String array as argument like 
    for (Object obj: objList) { <-- will loop same times as for the String array. 
     boolean res = processData(obj.getDataMethod(), strArr); <-- again pass the same array as argument to another method. 
     // This method will get called as many time as array length. 
    } 
} 

第二の方法:

public boolean processData(String data, String[] strArr) { 
    // ..... some processing. 
    // loop over String array and compare with data to process. 
    for(String str: strArr) { 
     String[] againStrArr = str.split(","); 
     if(againStrArr[0].equals(data)) { 
      // ... process on data and get the result. 
     } 
    } 
    // ..... other statements of method. 
} 

だから、あなたが見ることができるように同じ配列を2つのメソッドに渡して、何度も何度も繰り返します。私の配列のサイズが非常に長く、通常の場合には約2000個の要素であるため、Javaではこの良い習慣です。私はこのくらいのループだ理由について


説明:

私は、データベースに更新する必要がDB_NAMEとmyObjectというのdb_scoreを含むリクエストからString配列を得ました。 strArrの各要素はカンマで区切られ、db_name,db_scoreなどのdb値で区切られています。最初に配列をループし、すべての名前の文字列をコンマで区切って作成し、次にデータベースでクエリを実行してMyObjectのListを作成します。次に、このリストをループして新しいスコアでmyObjを更新しますが、名前の正確なスコアを取得するには、配列をループして名前を比較してスコアを取得する必要があります。


これは私のテーブルと呼ばれる選手である:文字列配列で

id | name | score 
1 | mark | 5 
2 | mark_1 | 5 
3 | mark_2 | 5 
4 | mark_3 | 5 

サンプルデータ:今、私は、配列を反復処理し、カンマで区切られた名前の文字列を作成するなどクエリでそれを使用{"mark,10","mark_1,15","mark_2,20","mark_3,30"}

select * from myObject where name in ('mark','mark_2','mark_2','mark_3') 
            |_________________________________| 
                | 
        this much part is built from looping over the String array 

したがって、最初の繰り返しはwhere句クエリのこのクエリはList of MyObjectを返します。 2回目に、このリストを繰り返してプレイヤーのスコアを更新します。しかし、特定のプレイヤー名の得点を得るためには、strArrayを繰り返し処理して見つける必要があります。したがって、リストの各要素について、メソッドを呼び出してplayerNameとstrArrを渡してスコアを取得し、最後にデータベースで更新する必要があります。

+0

一つだけの事かもしれません想定し、常にあなたのid列でフィルタリングする必要があり、そうすれば、別のループをなくすことができます(そこに2つの方法がある理由を特定しない限り)。 – kosa

+0

@thinksteep:2つの方法を持つ唯一の理由は、リストがここに示すようにビルドされていないことです。実際にはデータベースから取得されます。 –

+0

配列全体をループするのは悪いコーディングではありませんが、実際には同じ配列を渡してループしてから、新しいArrayListを作成してから再度ループすることが懸念されます。あなたは何をしようとしているのかを明確にしてから、何らかの処理を排除するのを助けることができます。 – medopal

答えて

-1

Java実行環境では、メモリ管理が良好です。使用されていないときは未使用の変数も消去されるので、100万個の配列を宣言することさえできます。あなたは「MyObjectに」これの長さの配列が、私はあなたがアレイとデータを処理し、1つだけを使用する唯一の方法を使用することができますね「strArr」 の長さに等しい使用することができます代わりにOBJLIST の

0

ループはstrArrがすでに利用可能であるため、反復のカウントが定義されます。

+0

のためのリストを依頼するのは自由です、私の答えがお役に立てば幸いここに示したように、実際にあなたがお勧めのようにそうすることはできませんデータベースから得ている、構築されたが、提案のためのthnxされていません。 –

1

心配しないでください。配列を渡すと、配列自体はスタックにコピーされず、スタックへの参照だけがコピーされます。あなたが好きなだけ多くのメソッドに配列を渡すことは、まったく問題ありません。配列のサイズはパフォーマンスに何の違いもありません(もちろん、メソッド自体の中では例外です)。最終的な説明パー

0

、いいえ、あなたはここで、二回反復する必要はありません、あなたの問題を解決することができ、いくつかの方法があります。代わりに、すべての項目にWHERE句を作成する

まずソリューション
、なぜは名前をWHERE句で直接更新するだけではありません。例えば

loop through all names and scores (your original array) 
    split the name and score 
    execute an update on database(param_player_name,param_player_score) 

UPDATE文:

UPDATE Players 
SET score = param_player_score 
WHERE name = param_player_name; 

第二の溶液(お勧めしますが、ただの情報のためではない)
の代わりに再びループは、ちょうどHashMap代わりの配列にあなたのオブジェクトを追加します。例:

Map<String,Long> myMap = new HashMap<String,Long>(); 
loop through all names and scores (your original array) 
    myMap.put(name,score); 

あなたがnameMapの鍵を作り、(第2ループ内)のスコアを取得するためにそのように、あなただけの呼び出し:

Long score = myMap.get(name); 

を私が言ったように、次のソリューション推奨されていません。なぜなら、非常に長いWHERE節を生成する必要があり、これは良い考えではないため、プレーヤーの数が増えすぎると問題が発生する可能性があるからです。

重要な注意
更新し、データを取得するとき、常に代わりに何か他の列のIDを使用し、データベースを扱います。だから、あなたのWHEREはそれがUniqueできないことで、あなたのNameフィールドに対しUniqueNOT NULLをだと私は、リストとprocessArrayでPROCESSDATAを呼び出すために追加削除されるだろうNULL

+0

あなたの最初の解決策:最初は同じと思っていましたが、それはあまりにも多くのdbセッションを開き、私が休止状態を使用しているときに例外が発生する可能性があるためです。すべての反復で、新しいdbセッションを開き、クエリを実行してからセッションを閉じます。これははるかに重い操作になるでしょう。私はあなたの2番目のソリューションを使用することができます、これは2番目のメソッドに行くことを省略し、再びstrArrをループします。 –

+0

また、あなたのメモのために:私はdb_idをすべきだと知っていますが、この文字列配列は実際にはUI側でユーザーがアップロードしたファイルから生成されています。特定のオブジェクトのdb_idが何であるかをユーザーが知ることはできません。 –

関連する問題