这是
Array.prototype.splice()根据Javascript
MDN规范的方法的Java实现。
public static <T>T[] splice(final T[] array, int start) { if (start < 0) start += array.length; return splice(array, start, array.length - start); } @SuppressWarnings("unchecked") public static <T>T[] splice(final T[] array, int start, final int deleteCount) { if (start < 0) start += array.length; final T[] spliced = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - deleteCount); if (start != 0) System.arraycopy(array, 0, spliced, 0, start); if (start + deleteCount != array.length) System.arraycopy(array, start + deleteCount, spliced, start, array.length - start - deleteCount); return spliced; } @SuppressWarnings("unchecked") public static <T>T[] splice(final T[] array, int start, final int deleteCount, final T ... items) { if (start < 0) start += array.length; final T[] spliced = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - deleteCount + items.length); if (start != 0) System.arraycopy(array, 0, spliced, 0, start); if (items.length > 0) System.arraycopy(items, 0, spliced, start, items.length); if (start + deleteCount != array.length) System.arraycopy(array, start + deleteCount, spliced, start + items.length, array.length - start - deleteCount); return spliced; }以下JUnit代码测试了此实现:
@Test public void testSplice() { final String[] array = new String[] {"a", "b", "c", "d", "e", "f"}; Assert.assertArrayEquals(new String[] {"c", "d", "e", "f"}, Arrays.splice(array, 0, 2)); Assert.assertArrayEquals(new String[] {"a", "d", "e", "f"}, Arrays.splice(array, 1, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "e", "f"}, Arrays.splice(array, 2, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "f"}, Arrays.splice(array, 3, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, 4, 2)); try { Arrays.splice(array, 5, 2); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } try { Arrays.splice(array, -2, 3); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, -2, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "f"}, Arrays.splice(array, -3, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "e", "f"}, Arrays.splice(array, -4, 2)); Assert.assertArrayEquals(new String[] {"a", "d", "e", "f"}, Arrays.splice(array, -5, 2)); Assert.assertArrayEquals(new String[] {"c", "d", "e", "f"}, Arrays.splice(array, -6, 2)); try { Arrays.splice(array, -7, 2); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } Assert.assertArrayEquals(new String[] {}, Arrays.splice(array, 0)); Assert.assertArrayEquals(new String[] {"a"}, Arrays.splice(array, 1)); Assert.assertArrayEquals(new String[] {"a", "b"}, Arrays.splice(array, 2)); Assert.assertArrayEquals(new String[] {"a", "b", "c"}, Arrays.splice(array, 3)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, 4)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e"}, Arrays.splice(array, 5)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e", "f"}, Arrays.splice(array, 6)); try { Arrays.splice(array, 7); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e"}, Arrays.splice(array, -1)); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, -2)); Assert.assertArrayEquals(new String[] {"a", "b", "c"}, Arrays.splice(array, -3)); Assert.assertArrayEquals(new String[] {"a", "b"}, Arrays.splice(array, -4)); Assert.assertArrayEquals(new String[] {"a"}, Arrays.splice(array, -5)); Assert.assertArrayEquals(new String[] {}, Arrays.splice(array, -6)); try { Arrays.splice(array, -7); Assert.fail("Expected NegativeArraySizeException"); } catch (final NegativeArraySizeException e) { } Assert.assertArrayEquals(new String[] {"x", "y", "z", "c", "d", "e", "f"}, Arrays.splice(array, 0, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "x", "y", "z", "d", "e", "f"}, Arrays.splice(array, 1, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "b", "x", "y", "z", "e", "f"}, Arrays.splice(array, 2, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "b", "c", "x", "y", "z", "f"}, Arrays.splice(array, 3, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "x", "y", "z"}, Arrays.splice(array, 4, 2, "x", "y", "z")); try { Arrays.splice(array, 5, 2, "x", "y", "z"); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "x", "y", "z"}, Arrays.splice(array, -2, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "b", "c", "x", "y", "z", "f"}, Arrays.splice(array, -3, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "b", "x", "y", "z", "e", "f"}, Arrays.splice(array, -4, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"a", "x", "y", "z", "d", "e", "f"}, Arrays.splice(array, -5, 2, "x", "y", "z")); Assert.assertArrayEquals(new String[] {"x", "y", "z", "c", "d", "e", "f"}, Arrays.splice(array, -6, 2, "x", "y", "z")); try { Arrays.splice(array, -7, 2, "x", "y", "z"); Assert.fail("Expected ArrayIndexOutOfBoundsException"); } catch (final ArrayIndexOutOfBoundsException e) { } }编辑: 正如@denys-
séguret正确指出的那样,此实现与Javascript规范不同,因为它不会更改/修改原始数组。而是,此实现返回一个新的数组实例。
编辑: 在给定的Maven存储库中,以下Maven工件可以使用此实现:
<project> ... <dependencies> <dependency> <groupId>org.safris.commons</groupId> <artifactId>commons-lang</artifactId> <version>1.6.4</version> </dependency> </dependencies> ... <repositories> <repository> <id>mvn.repo.safris.org</id> <url>http://mvn.repo.safris.org/m2</url> </repository> </repositories> ...</project>



