code: public static LofDataSet mergeDataSet(LofDataSet baseDataSet, LofDataSet targetDataSet, int max)
      {
          Collection<LofPoint> basePointList = baseDataSet.getDataMap().values();
          Collection<LofPoint> targetPointList = targetDataSet.getDataMap().values();
  
          // LOFの対象点を時刻でソートしたリストを生成する。
          List<LofPoint> mergedList = new ArrayList<>();
          mergedList.addAll(basePointList);
          mergedList.addAll(targetPointList);
          Collections.sort(mergedList, new LofPointComparator());
  
          // ソート後、新しい方から扱うため順番を逆にする。
          Collections.reverse(mergedList);
  
          // 新しいデータから順にマージ後のモデルに反映する。
          // 但し、お互いに非同期でマージが行われるため同様のIDを持つデータが複数存在するケースがある。
          // そのため、IDを比較してそれまでに取得していないデータの追加のみを行う。
          Set<String> registeredId = new HashSet<>();
          int addedCount = 0;
          LofDataSet resultDataSet = new LofDataSet();
  
          for (LofPoint targetPoint : mergedList)
          {
              if (registeredId.contains(targetPoint.getDataId()) == true)
              {
                  continue;
              }
  
              registeredId.add(targetPoint.getDataId());
              resultDataSet.addData(targetPoint);
              addedCount++;
  
              if (addedCount >= max)
              {
                  break;
              }
          }
  
          return resultDataSet;
      }
docs: 学習データのマージを行う。<br>
  中間データは生成されないため、必要な場合は本メソッド実行後に{@link #initDataSet(int, LofDataSet)}メソッドを実行すること。
  
  @param baseDataSet マージのベース学習データ
  @param targetDataSet マージ対象の学習データ
  @param max データ保持数最大値
  @return マージ後の学習データ