Javaは組み合わせを処理する標準APIが無いらしい

f:id:ts0818:20190505165446j:plain

な、何と...Javaには組み合わせを処理してくれるような標準ライブラリが無いんだそうな...どうもボクです。

 

www.monotalk.xyz

⇧  上記サイト様によりますと、外部APIの「Apache Common」を使えばイケるらしい。

www.baeldung.com

⇧  上記サイト様によりますと、

の3つの外部APIのいずれかでコンビネーションが実現できると。 

Rubyなんかだと、

maku77.github.io

⇧  上記サイト様によりますと、標準で用意してくれているようです。

 

組み合わせを考えてみる

お馴染みの、

judge.u-aizu.ac.jp

⇧  上記サイト様の問題です。

そんでは、Eclipseを起動し、適当なJavaプロジェクト、クラスを作成。

f:id:ts0818:20190505171031p:plain

んで、ソースコードはこんな感じで。

TestCombination.java

package aizu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestCombination {

  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    List<Map<Integer, List<Integer>>> list = new ArrayList<>();
    int mapKey = 0;

    while (true) {
      Map<Integer, List<Integer>> combination = new HashMap<>();
      try {
        String[] condition = br.readLine().split("\\s");
        int n = Integer.parseInt(condition[0]);
        int x = Integer.parseInt(condition[1]);
        
        // 入力値が、「0 0」の場合
        if (n == 0 && x == 0) {
          break; // ループ処理を抜ける
        }
        
        for (int i = 1; i <= n - 2; i++) {
          for (int j = i + 1; j <= n - 1; j++) {
            for (int k = j + 1; k <= n; k++) {
              if ((x == (i + j + k))) {
                // 組み合わせをマップに保存
                combination.put(mapKey, Arrays.asList(i, j, k));
                mapKey++;
              }
            }
          }
        }
        // 組み合わせのマップをリストに保存
        list.add(combination);

      } catch (NumberFormatException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (IOException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      }
    }
    
    // 結果を出力
    list.stream().forEach(map -> {
      System.out.println(map.size());
    });
  }
}

んでは、実行。

f:id:ts0818:20190505171908p:plain

入力値は、

Input

複数のデータセットが入力として与えられます。各データセットでは、空白で区切られた nx が 1 行に与えられます。

nx がともに 0 のとき入力の終わりとします。

組み合わせの数 | プログラミング入門 | Aizu Online Judge

ということで、

f:id:ts0818:20190505172137p:plain

できました~。

まぁ、しかし、これ、3つの数字の組み合わせだから、3重ループとかで何とか済んでるけど、もし100つの数字の組み合わせとかってなったらどうすれば良いんでしょうね...
とりあえず、AIZU ONLINE JUDGEの練習問題は完了だ~、

f:id:ts0818:20190505174259p:plain

と思いきや、

f:id:ts0818:20190505174436p:plain

なんか、「Algorithms and Data Structures I」「Introduction to Programming II」って枠があるようですね...終わりが見えないっす(涙)

今回はこのへんで。