diff --git a/src/org/opensha2/data/Data.java b/src/org/opensha2/data/Data.java index b32430b3dc28ff269f52d7a69ab6a237dbcb7bc7..8a074a39f692db264feba23f3c24162468394ad7 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 7781dec7c3b1b32a9ee5323096c6c079935daef2..f3d8f96a49bec9ff31c429cb8973e44874e89ab2 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 a58ea154fe6d397950561b23fed21027cf857e85..0ed827b989f1418b89f77eace7118ce5b9229785 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}. *