diff --git a/CHANGELOG.md b/CHANGELOG.md index 184ace79..9d51eec5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed * Refactored Permutation.equals() method (non-breaking). +* Refactored target array allocation in the various SequenceSampler implementations (non-breaking). ### Deprecated diff --git a/pom.xml b/pom.xml index c5d9d263..e0f3ffb1 100644 --- a/pom.xml +++ b/pom.xml @@ -230,6 +230,9 @@ 3.15.0 25 + + -Xlint:unchecked + diff --git a/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java b/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java index b31ea451..c94052d3 100644 --- a/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java +++ b/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java @@ -1,6 +1,6 @@ /* * JavaPermutationTools: A Java library for computation on permutations and sequences - * Copyright 2005-2023 Vincent A. Cicirello, . + * Copyright 2005-2026 Vincent A. Cicirello, . * * This file is part of JavaPermutationTools (https://jpt.cicirello.org/). * @@ -222,7 +222,8 @@ public char[] nextSample(String source, int k, char[] target) { @Override public T[] nextSample(T[] source, int k, T[] target) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); int[] indexes = r.sampleInsertion(source.length, k, null); for (int i = 0; i < k; i++) { target[i] = source[indexes[i]]; @@ -595,7 +596,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera */ public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); int[] indexes = RandomSampler.sampleInsertion(source.length, k, null, r); for (int i = 0; i < k; i++) { target[i] = source[indexes[i]]; diff --git a/src/main/java/org/cicirello/sequences/SequencePoolSampler.java b/src/main/java/org/cicirello/sequences/SequencePoolSampler.java index aa9d4853..d84f5768 100644 --- a/src/main/java/org/cicirello/sequences/SequencePoolSampler.java +++ b/src/main/java/org/cicirello/sequences/SequencePoolSampler.java @@ -1,6 +1,6 @@ /* * JavaPermutationTools: A Java library for computation on permutations and sequences - * Copyright 2005-2023 Vincent A. Cicirello, . + * Copyright 2005-2026 Vincent A. Cicirello, . * * This file is part of JavaPermutationTools (https://jpt.cicirello.org/). * @@ -247,7 +247,8 @@ public char[] nextSample(String source, int k, char[] target) { @Override public T[] nextSample(T[] source, int k, T[] target) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); T[] pool = Arrays.copyOf(source, source.length); int remaining = pool.length; for (int i = 0; i < k; i++) { @@ -653,7 +654,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera */ public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); T[] pool = Arrays.copyOf(source, source.length); int remaining = pool.length; for (int i = 0; i < k; i++) { diff --git a/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java b/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java index 98618356..dc7a740b 100644 --- a/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java +++ b/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java @@ -1,6 +1,6 @@ /* * JavaPermutationTools: A Java library for computation on permutations and sequences - * Copyright 2005-2023 Vincent A. Cicirello, . + * Copyright 2005-2026 Vincent A. Cicirello, . * * This file is part of JavaPermutationTools (https://jpt.cicirello.org/). * @@ -237,7 +237,8 @@ public char[] nextSample(String source, int k, char[] target) { @Override public T[] nextSample(T[] source, int k, T[] target) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); System.arraycopy(source, 0, target, 0, k); for (int i = k; i < source.length; i++) { int j = r.nextInt(i + 1); @@ -635,7 +636,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera */ public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) { SequenceSamplerUtils.validateK(k, source.length); - target = SequenceSamplerUtils.allocateIfNecessary(source, k, target); + target = + SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target); System.arraycopy(source, 0, target, 0, k); for (int i = k; i < source.length; i++) { int j = RandomIndexer.nextInt(i + 1, r); diff --git a/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java b/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java index c2c82dd5..2e0d9b8e 100644 --- a/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java +++ b/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java @@ -1,6 +1,6 @@ /* * JavaPermutationTools: A Java library for computation on permutations and sequences - * Copyright 2005-2023 Vincent A. Cicirello, . + * Copyright 2005-2026 Vincent A. Cicirello, . * * This file is part of JavaPermutationTools (https://jpt.cicirello.org/). * @@ -42,11 +42,9 @@ static void validateK(int k, int sourceLength) { } @SuppressWarnings("unchecked") - static T[] allocateIfNecessary(T[] source, int k, T[] target) { - if (target == null) { - target = (T[]) Array.newInstance(source.getClass().getComponentType(), k); - } else if (target.length < k) { - target = (T[]) Array.newInstance(target.getClass().getComponentType(), k); + static T[] allocateIfNecessary(Class componentType, int k, T[] target) { + if (target == null || target.length < k) { + return (T[]) Array.newInstance(componentType, k); } return target; }