第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據(jù)項目屬性的總和對集合進行分區(qū),直至達到給定的限制?

如何根據(jù)項目屬性的總和對集合進行分區(qū),直至達到給定的限制?

慕絲7291255 2022-09-22 19:23:49
如何根據(jù)集合中每個項目的一個字段求和,將集合分塊為 N 個塊,直至達到給定的最大值?例如,給定以下內容:class FileObject { public long sizeInBytes; }Collection<FileObject> files;long MAX_SIZE_THRESHOLD = 1024 * 1024 * 100; // 100 MB我想將項轉換為具有最少數(shù)量的內部集合的項,并滿足謂詞,即對于每個集合,每個元素的總和小于 。Collection<Collection<FileObject>>sizeInBytesMAX_SIZE_THRESHOLD進一步說明,除了上述要求之外,如果擴展為包含時間戳,我還想按年,月和日對結果進行分區(qū)。FileObject例如class FileObject { public long sizeInBytes; public long modifiedDate; }我希望最終結果如下所示:Map<Integer, Map<Integer, Map<Integer, Collection<FileObject>>>>其中映射中的鍵是:年、月和日(對應于 的 ),并且集合包含該年、月、日內的所有文件,并且每個文件的大小英寸之和小于 。FileObjectmodifiedDateMAX_SIZE_THRESHOLD是否可以在避免循環(huán)和使用使用 Stream API 或其他可用的函數(shù)構造的同時完成這兩個操作?兩者都可以在一個語句中完成嗎?
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經(jīng)驗 獲得超9個贊

您可以在流交易中嘗試。下面是示例代碼:StreamEx.collapse(...)

final long MAX_SIZE_THRESHOLD = 12; // only for test purpose.


// create the sample file objects with random size for test.

Collection<FileObject> files =

    new Random().longs(0, 1000).limit(50).mapToObj(n -> new FileObject(n % 15, n))

    .collect(Collectors.toList());


// here is the final solution you can try

final MutableLong remaining = MutableLong.of(MAX_SIZE_THRESHOLD);


List<List<FileObject>> result = StreamEx.of(files).collapse((a, b) -> {

  if (b.sizeInBytes <= remaining.value() - a.sizeInBytes) {

    remaining.subtract(a.sizeInBytes);

    return true;

  } else {

    remaining.setValue(MAX_SIZE_THRESHOLD);

    return false;

  }

}, Collectors.toList()).toList();


result.forEach(System.out::println);

以下是您問題的第2部分嵌套的解決方案:groupingBy


// import static java.util.stream.Collectors.*

Map<Integer, Map<Integer, Map<Integer, List<FileObject>>>> result2 = files.stream()

    .filter(f -> f.sizeInBytes < MAX_SIZE_THRESHOLD)

    .collect(groupingBy(f -> f.getYear(), 

                        groupingBy(f -> f.getMonth(), 

                                        groupingBy(f -> f.getDay(), toList()))));


result2.entrySet().forEach(System.out::println);

最后,這是我用來測試的:FileObject


static class FileObject {

  public long sizeInBytes;

  public long modifiedDate;


  public FileObject(long sizeInBytes, long modifiedDate) {

    this.sizeInBytes = sizeInBytes;

    this.modifiedDate = modifiedDate;

  }


  public int getYear() {

    return (int) modifiedDate / 100; // only for test purpose

  }


  public int getMonth() {

    return (int) (modifiedDate % 100) / 10; // only for test purpose

  }


  public int getDay() {

    return (int) modifiedDate % 10; // only for test purpose

  }


  @Override

  public String toString() {

    return sizeInBytes + "-" + modifiedDate;

  }

}

根據(jù)評論更新:


您將需要 .Collectors.collectAndThen


Function<List<FileObject>, List<List<FileObject>>> finisher = fileObjs -> {

  MutableLong remaining2 = MutableLong.of(MAX_SIZE_THRESHOLD);

  return StreamEx.of(fileObjs).collapse((a, b) -> {

    if (b.sizeInBytes <= remaining2.value() - a.sizeInBytes) {

      remaining2.subtract(a.sizeInBytes);

      return true;

    } else {

      remaining2.setValue(MAX_SIZE_THRESHOLD);

      return false;

    }

  }, toList()).toList();

};


Map<Integer, Map<Integer, Map<Integer, List<List<FileObject>>>>> result4 = files.stream()

    .collect(groupingBy(f -> f.getYear(),

        groupingBy(f -> f.getMonth(), 

            groupingBy(f -> f.getDay(), collectingAndThen(toList(), finisher)))));

結果類型應為 ,而不是 。Map<Integer, Map<Integer, Map<Integer, List<List<FileObject>>>>>Map<Integer, Map<Integer, Map<Integer, List<FileObject>>>>


順便說一句,如果你不想寫函數(shù)(我不:-)),試試我的庫:算盤-Util:finisher


Function<List<FileObject>, List<List<FileObject>>> finisher2 = fileObjs -> Seq.of(fileObjs)

    .split(MutableLong.of(0), (f, sizeSum) -> sizeSum.addAndGet(f.sizeInBytes) <= MAX_SIZE_THRESHOLD,

        sizeSum -> sizeSum.setValue(0));


// import static com.landawn.abacus.util.stream.Collectors.MoreCollectors.*;

StreamEx.of(files)

    .toMap(f -> f.getYear(),

        groupingBy(f -> f.getMonth(),

            groupingBy(f -> f.getDay(), collectingAndThen(toList(), finisher2))));




查看完整回答
反對 回復 2022-09-22
  • 1 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號