From 8dc523faab4899942ff49eae3f6af8dcee4912ee Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Wed, 12 Apr 2017 09:11:39 -0600 Subject: [PATCH] added trim() to XySequence --- src/org/opensha2/data/Data.java | 18 ++++++++++++++++++ src/org/opensha2/data/ImmutableXySequence.java | 11 +++++++++++ src/org/opensha2/data/XySequence.java | 10 ++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/org/opensha2/data/Data.java b/src/org/opensha2/data/Data.java index b32430b3d..8a074a39f 100644 --- a/src/org/opensha2/data/Data.java +++ b/src/org/opensha2/data/Data.java @@ -1447,4 +1447,22 @@ public final class Data { // checkArgument(expression, "value"); // } + static int firstNonZeroIndex(double... data) { + for (int i=0; i<data.length; i++) { + if (data[i] != 0.0) { + return i; + } + } + return -1; + } + + static int lastNonZeroIndex(double... data) { + for (int i=data.length-1; i>=0; i--) { + if (data[i] != 0.0) { + return i; + } + } + return -1; + } + } diff --git a/src/org/opensha2/data/ImmutableXySequence.java b/src/org/opensha2/data/ImmutableXySequence.java index 7781dec7c..f3d8f96a4 100644 --- a/src/org/opensha2/data/ImmutableXySequence.java +++ b/src/org/opensha2/data/ImmutableXySequence.java @@ -2,6 +2,7 @@ package org.opensha2.data; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkElementIndex; +import static com.google.common.base.Preconditions.checkState; import java.util.Arrays; @@ -65,6 +66,16 @@ class ImmutableXySequence extends XySequence { public final boolean isClear() { return Data.areZeroValued(ys); } + + @Override + public final XySequence trim() { + checkState(!this.isClear(), "XySequence.trim() not permitted for 'clear' sequences"); + int minIndex = Data.firstNonZeroIndex(ys); + int maxIndex = Data.lastNonZeroIndex(ys) + 1; + return new ImmutableXySequence( + Arrays.copyOfRange(xs, minIndex, maxIndex), + Arrays.copyOfRange(ys, minIndex, maxIndex)); + } @Override public final boolean equals(Object obj) { diff --git a/src/org/opensha2/data/XySequence.java b/src/org/opensha2/data/XySequence.java index a58ea154f..0ed827b98 100644 --- a/src/org/opensha2/data/XySequence.java +++ b/src/org/opensha2/data/XySequence.java @@ -506,6 +506,16 @@ public abstract class XySequence implements Iterable<XyPoint> { */ public abstract boolean isClear(); + /** + * Returns a new, immutable sequence that has had all leading and trailing + * zero-valued points ({@code y = 0}) removed. Any zero-valued points in the + * middle of this sequence are ignored. + * + * @throws IllegalStateException if {@link #isClear() this.isClear()} as empty + * sequences are not permitted + */ + public abstract XySequence trim(); + /** * Transforms all y-values in place using the supplied {@link Function}. * -- GitLab