ある整数を可能な限り整数のまま等分したいということがあります。例えば、あるバッチ処理で、処理対象件数が300件だとして、スレッド数が9の場合に各スレッドになるべく均等に処理対象のデータを渡したいとします。
この場合、300を9等分するので、[42, 43, 43, 43, 43, 43, 43] と分割されます。Javaで書くとこんな感じ↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.util.ArrayList; public class TestClass { public static void main(String[] args) { int amount = 300; int n = 9; ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < n; i++) { int ans = (amount + i) / n; list.add(ans); } System.out.println(list); } } |
もちろん、割り切れる場合も同じアルゴリズムです。
amount=300、n=9の値を変更すれば好きな値で動きます。
なぜこれでうまく動くのかというと、簡単に言うと、すべて均等に分けたあとに、余りを1ずつ配っているイメージです。
ここら辺のサイトの説明がわかりやすいです。
https://qiita.com/keisuke-nakata/items/c18cda4ded06d3159109
https://tmtms.hatenablog.com/entry/2016/07/27/ruby-split-array
これを知る前は、なかなかイケてないロジックを書いていたな・・・ (;゚Д゚)y