0

文字列のArrayListがありますが、サイズは異なる場合があります。

List<String> strList1 = new ArrayList<String>();

文字列ごとに、メソッドupdateDetails(strList1)を呼び出しています。このメソッドは、文字列を処理し、いくつかのロジックに基づいてopを出力します。

上記のメソッドupdateDetails(strList1)を最初の文字列に対して呼び出し、次に5(最初の1を含む)などに対して、以下のように一定の間隔で呼び出します。

間隔は1、5、10、50、100、200、1000です。

o / p(strList1のサイズが25の場合)は次のようになります。

Result for first 1:
Result for first 5:..
Result for first 10:..
Result for total 25 : 

o / p(strList1のサイズが9の場合)は次のようになります。

Result for first 1:..
Result for first 5:..
Result for total 9:..

それについてどうやって行くのですか?

4

4 に答える 4

3

で重複を避けることができます

int len = strList1.size();
NavigableSet<Integer> sizes = new TreeSet<>();
sizes.addAll(Arrays.asList(1, 5, 10, 50, 100, 200, 1000, len));
for(int size: sizes.lower(len+1)) {
    List<String> list2 = strList1.subList(0, size);
    // process list2
}

重複が問題にならない場合。

int len = strList1.size();
for(int size: new int[] { 1, 5, 10, 50, 100, 200, 1000, len }) {
    if(size > len) continue;
    List<String> list2 = strList1.subList(0, size);
    // process list2
}
于 2012-08-09T10:22:02.453 に答える
1

私は-何をするかについて少し推測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);

私の主な答えは、より複雑ですが、より柔軟だと思います。

于 2012-08-09T10:43:16.053 に答える
1

これらの線に沿った何かがあなたの要件を満たしますか?

int[] intervals = new int[] {1, 5, 10, 50, ...}
for (int interval : intervals)
{
    for (int i = 0; i < interval && i < strList1.size(); i++)
    {
        // Do stuff.
    }
}
于 2012-08-09T10:22:36.963 に答える
0

0から1、2から9、9から15などを処理したい場合は、それを行うことができます(これは、c#ですが、Javaでは非常に似ています)

        List<String> strList1 = new List<String>{"alfa","beta","gamma"};
        List<int> intervals= new List<int>{1,5,10,25,30};
        int index = 0, j=0;
        while (index<strList1.Count)
        {
            int from = index, to = index + intervals[j];
            doStuff(strList1, from, to);
            index +=intervals[j];
            j++;
        }
于 2012-08-09T10:27:23.650 に答える