私は-何をするかについて少し推測updateDetails()
して-あなたはその署名を次のように変更するべきだと思います:
Results updateDetails(Results accumulatedResults, List<String> items);
独自のResultsクラスを適切に定義し、それを記述しtoString()
ます。updateDetails
以前の結果と新しいリストに基づいて結果を計算します。したがって、たとえば、文字列の長さの合計を計算することになっている場合は、次のようになります。
Results updateDetails(Results accumulatedResults, List<String> items) {
int sum = accumulatedResults.getSum();
for(String item : items) {
sum += item.length();
}
return new Results(sum);
}
これは、潜在的に高価な計算を繰り返さないことを意味します。
次に、コードはこれを繰り返し呼び出す必要があります。
Results results = new Results(); // start with an empty one
results = updateDetails(results,strings.subList(0,1));
System.out.println(results);
results = updateDetails(results,strings.subList(1,5));
System.out.println(results);
results = updateDetails(results,strings.subList(5,10));
System.out.println(results);
... 等々。関数自体が印刷を行うよりも、関数が印刷可能な値を返すようにする方がはるかに優れていることに注意してください。より再利用可能で、よりテスト可能です。
もちろん、これはループで行います。
Results results = new Results(); // start with an empty one
int[] sizes = new int[] { 1, 5, 10, 25, 50, 100, 200, 1000 };
int last=0;
for(int i = 0; i<size.length; i++) {
int size = sizes[i];
results = updateDetails(results,strings.subList(last,size));
System.out.println(results);
last = size;
}
それが基本です。書かれているように、1000より短い入力リストでは失敗します。次のことを行うための演習として残しておきます。
- サイズ>strings.size()+1かどうかを確認します
- その場合は、サイズをstrings.size()+ 1に調整し、これをループの最後の反復にします
(List.subList()の仕組みのために+1)
また、1000より長い入力リストで何が起こるかを考える必要があります。単純な配列ルックアップではなく、のsizeForIteration(int iteration)
任意の大きな値を処理するメソッドがある方がよいでしょう。iteration
より簡単なアルゴリズムは、「レポートポイント」の知識をupdateDetailsロジックに入れることです。
for(int i=0; i<list.size; i++) {
// do something with list.get(i)
if( sizes.contains(i) {
System.out.println(something);
}
}
System.out.println(something);
私の主な答えは、より複雑ですが、より柔軟だと思います。