From 577f01a27c1e566f48b825dd808f6ee22c4ce3ab Mon Sep 17 00:00:00 2001 From: Vojtech Moravec <vojtech.moravec.st@vsb.cz> Date: Thu, 22 Oct 2020 13:23:15 +0200 Subject: [PATCH] HyperStackDimensions parsing util. --- .../java/cz/it4i/qcmp/cli/ParseUtils.java | 66 +++++++++++++++++++ .../it4i/qcmp/data/HyperStackDimensions.java | 5 ++ 2 files changed, 71 insertions(+) diff --git a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java index 5aa279b..aa261af 100644 --- a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java +++ b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java @@ -1,9 +1,11 @@ package cz.it4i.qcmp.cli; +import cz.it4i.qcmp.data.HyperStackDimensions; import cz.it4i.qcmp.data.Range; import cz.it4i.qcmp.data.V2i; import cz.it4i.qcmp.data.V3i; +import java.util.ArrayList; import java.util.Optional; public abstract class ParseUtils { @@ -95,4 +97,68 @@ public abstract class ParseUtils { } return Optional.empty(); } + + /** + * Find all occurrences of c in string. + * + * @param string String to look for c in. + * @param c Characted to find in the string. + * @return Array of all indexes in the string. + */ + private static int[] findAllIndexesOfChar(final String string, final char c) { + final ArrayList<Integer> indexes = new ArrayList<>(2); + + int index = string.indexOf(c); + while (index >= 0) { + indexes.add(index); + index = string.indexOf(c, index + 1); + } + + return indexes.stream().mapToInt(Integer::intValue).toArray(); + } + + /** + * Tries to parse HyperStackDimensions from a string with delimiters. + * + * @param hyperStackDimensionsString String containing the dimensions. + * @param delimiter Delimiter. + * @return Parsed HyperStackDimensions or empty optional. + */ + public static Optional<HyperStackDimensions> tryParseHyperStackDimensions(final String hyperStackDimensionsString, + final char delimiter) { + final String string = (delimiter != ' ') ? removeSpacesInString(hyperStackDimensionsString) : hyperStackDimensionsString; + + final int[] indexes = findAllIndexesOfChar(string, delimiter); + + if ((indexes.length < 1) || (indexes.length > 3)) + return Optional.empty(); + + int x = -1; + int y = -1; + int z = 1; + int t = 1; + + // Required part. + final Optional<Integer> maybeX = tryParseInt(string.substring(0, indexes[0])); + final Optional<Integer> maybeY = tryParseInt(string.substring(indexes[0] + 1, indexes.length > 1 ? indexes[1] : string.length())); + if (!maybeX.isPresent() || !maybeY.isPresent()) + return Optional.empty(); + x = maybeX.get(); + y = maybeY.get(); + + if (indexes.length > 1) { + final Optional<Integer> maybeZ = tryParseInt(string.substring(indexes[1], indexes.length > 2 ? indexes[2] : string.length())); + if (!maybeZ.isPresent()) + return Optional.empty(); + z = maybeZ.get(); + + if (indexes.length > 2) { + final Optional<Integer> maybeT = tryParseInt(string.substring(indexes[2])); + if (!maybeT.isPresent()) + return Optional.empty(); + t = maybeT.get(); + } + } + return Optional.of(new HyperStackDimensions(x, y, z, t)); + } } diff --git a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java index 652486d..140eee7 100644 --- a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java +++ b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java @@ -82,4 +82,9 @@ public class HyperStackDimensions { public final int getNumberOfTimepoints() { return numberOfTimepoints; } + + @Override + public String toString() { + return String.format("X=%d;Y=%d;Z=%d;T=%d", width, height, sliceCount, numberOfTimepoints); + } } -- GitLab