From 2ba71573e604da683012fed8d4022718e861dacb Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Fri, 4 Feb 2022 18:59:24 +0100 Subject: [PATCH] add: implementation of splitter --- src/de/hhaalo/spandisc/IAddFileToMedium.java | 2 +- src/de/hhaalo/spandisc/Splitter.java | 77 +++++++++++++++++--- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/de/hhaalo/spandisc/IAddFileToMedium.java b/src/de/hhaalo/spandisc/IAddFileToMedium.java index f3e5d38..c3b931e 100644 --- a/src/de/hhaalo/spandisc/IAddFileToMedium.java +++ b/src/de/hhaalo/spandisc/IAddFileToMedium.java @@ -2,5 +2,5 @@ package de.hhaalo.spandisc; public interface IAddFileToMedium { - public int canAdd(IMedium disc, IFileSize file); + public boolean canAdd(IMedium disc, IFileSize file); } diff --git a/src/de/hhaalo/spandisc/Splitter.java b/src/de/hhaalo/spandisc/Splitter.java index c0eaca0..10878dd 100644 --- a/src/de/hhaalo/spandisc/Splitter.java +++ b/src/de/hhaalo/spandisc/Splitter.java @@ -1,22 +1,71 @@ package de.hhaalo.spandisc; import java.util.Comparator; +import java.util.ArrayList; +import java.util.Arrays; public class Splitter implements ISplitter { public IMedium splitter(IMedium srcdata) { - return new Medium(); + IMedium disc = splitterToDisc(srcdata, new CanAddFileToMedium()); + return disc; } public IMedium ignore(IMedium srcdata) { - return new Medium(); + IMedium ignore = splitterToDisc(srcdata, new BigFileIgnoreMedium()); + return ignore; } - public IMediumCollection splitAll(IMedium srcdatia) + public IMediumCollection splitAll(IMedium srcdata) { - return new MediumCollection(); + IMediumCollection col = new MediumCollection(); + + ArrayList medien = new ArrayList(); + + IMedium ignoredisc = ignore(srcdata); + if (ignoredisc.getFileSizeArray().length > 0) + medien.add(ignoredisc); + + while (srcdata.getFileSizeArray().length > 0) { + srcdata.setNr(srcdata.getNr() + 1); + medien.add(splitter(srcdata)); + } + + col.setMediumArray(new IMedium[medien.size()]); + medien.toArray(col.getMediumArray()); + + return col; + } + + private IMedium splitterToDisc(IMedium srcdata, IAddFileToMedium check) + { + Arrays.sort(srcdata.getFileSizeArray(), new CompareFileSizeBySize()); + + IMedium disc = new Medium(); + disc.setNr(srcdata.getNr()); + disc.setFreeSpace(srcdata.getFreeSpace()); + + ArrayList restfiles = new ArrayList(); + ArrayList discfiles = new ArrayList(); + + for (int i = 0; i < srcdata.getFileSizeArray().length; i++) { + if (check.canAdd(disc, srcdata.getFileSizeArray()[i])) + discfiles.add(srcdata.getFileSizeArray()[i]); + else + restfiles.add(srcdata.getFileSizeArray()[i]); + } + + srcdata.setFileSizeArray(new IFileSize[restfiles.size()]); + restfiles.toArray(srcdata.getFileSizeArray()); + + Arrays.sort(disc.getFileSizeArray(), new CompareFileSizeByName()); + + disc.setFileSizeArray(new IFileSize[discfiles.size()]); + discfiles.toArray(disc.getFileSizeArray()); + + return disc; } private class CompareFileSizeBySize implements Comparator @@ -34,15 +83,23 @@ public class Splitter implements ISplitter } } + private class CompareFileSizeByName implements Comparator + { + public int compare(IFileSize a, IFileSize b) + { + return a.getName().compareTo(b.getName()); + } + } + private class BigFileIgnoreMedium implements IAddFileToMedium { - public int canAdd(IMedium disc, IFileSize file) + public boolean canAdd(IMedium disc, IFileSize file) { - int retvalue = 0; + boolean retvalue = false; long filesize = (file.getFileSize() / 2048L) * 2048L; if (disc.getFreeSpace() < filesize) - retvalue = 1; + retvalue = true; return retvalue; } @@ -50,15 +107,15 @@ public class Splitter implements ISplitter private class CanAddFileToMedium implements IAddFileToMedium { - public int canAdd(IMedium disc, IFileSize file) + public boolean canAdd(IMedium disc, IFileSize file) { - int retvalue = 0; + boolean retvalue = false; long filesize = (file.getFileSize() / 2048L) * 2048L; if (disc.getFreeSpace() >= filesize) { disc.setFreeSpace(disc.getFreeSpace() - filesize); - retvalue = 1; + retvalue = true; } return retvalue; -- 2.39.5