JavaScript 方法中“splice(a,b,...)”的 Java 等效方法

Ern*_*dis 5 javascript java splice

someArray.splice(a,b,...)JavaScript 中的方法向数组添加或删除项目。用 Java 语言实现这种方法有什么好的、简单的解决方案呢?假设我们有String[]数组。

Sev*_*ris 6

Array.prototype.splice()以下是根据JavaScript MDN 规范的该方法的 Java 实现。

\n\n
  public static <T>T[] splice(final T[] array, int start) {\n    if (start < 0)\n      start += array.length;\n\n    return splice(array, start, array.length - start);\n  }\n\n  @SuppressWarnings("unchecked")\n  public static <T>T[] splice(final T[] array, int start, final int deleteCount) {\n    if (start < 0)\n      start += array.length;\n\n    final T[] spliced = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - deleteCount);\n    if (start != 0)\n      System.arraycopy(array, 0, spliced, 0, start);\n\n    if (start + deleteCount != array.length)\n      System.arraycopy(array, start + deleteCount, spliced, start, array.length - start - deleteCount);\n\n    return spliced;\n  }\n\n  @SuppressWarnings("unchecked")\n  public static <T>T[] splice(final T[] array, int start, final int deleteCount, final T ... items) {\n    if (start < 0)\n      start += array.length;\n\n    final T[] spliced = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - deleteCount + items.length);\n    if (start != 0)\n      System.arraycopy(array, 0, spliced, 0, start);\n\n    if (items.length > 0)\n      System.arraycopy(items, 0, spliced, start, items.length);\n\n    if (start + deleteCount != array.length)\n      System.arraycopy(array, start + deleteCount, spliced, start + items.length, array.length - start - deleteCount);\n\n    return spliced;\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下 JUnit 代码测试此实现:

\n\n
@Test\n  public void testSplice() {\n    final String[] array = new String[] {"a", "b", "c", "d", "e", "f"};\n\n    Assert.assertArrayEquals(new String[] {"c", "d", "e", "f"}, Arrays.splice(array, 0, 2));\n    Assert.assertArrayEquals(new String[] {"a", "d", "e", "f"}, Arrays.splice(array, 1, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "e", "f"}, Arrays.splice(array, 2, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "f"}, Arrays.splice(array, 3, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, 4, 2));\n    try {\n      Arrays.splice(array, 5, 2);\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n\n    try {\n      Arrays.splice(array, -2, 3);\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, -2, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "f"}, Arrays.splice(array, -3, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "e", "f"}, Arrays.splice(array, -4, 2));\n    Assert.assertArrayEquals(new String[] {"a", "d", "e", "f"}, Arrays.splice(array, -5, 2));\n    Assert.assertArrayEquals(new String[] {"c", "d", "e", "f"}, Arrays.splice(array, -6, 2));\n    try {\n      Arrays.splice(array, -7, 2);\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n\n    Assert.assertArrayEquals(new String[] {}, Arrays.splice(array, 0));\n    Assert.assertArrayEquals(new String[] {"a"}, Arrays.splice(array, 1));\n    Assert.assertArrayEquals(new String[] {"a", "b"}, Arrays.splice(array, 2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c"}, Arrays.splice(array, 3));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, 4));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e"}, Arrays.splice(array, 5));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e", "f"}, Arrays.splice(array, 6));\n    try {\n      Arrays.splice(array, 7);\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "e"}, Arrays.splice(array, -1));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d"}, Arrays.splice(array, -2));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c"}, Arrays.splice(array, -3));\n    Assert.assertArrayEquals(new String[] {"a", "b"}, Arrays.splice(array, -4));\n    Assert.assertArrayEquals(new String[] {"a"}, Arrays.splice(array, -5));\n    Assert.assertArrayEquals(new String[] {}, Arrays.splice(array, -6));\n    try {\n      Arrays.splice(array, -7);\n      Assert.fail("Expected NegativeArraySizeException");\n    }\n    catch (final NegativeArraySizeException e) {\n    }\n\n    Assert.assertArrayEquals(new String[] {"x", "y", "z", "c", "d", "e", "f"}, Arrays.splice(array, 0, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "x", "y", "z", "d", "e", "f"}, Arrays.splice(array, 1, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "b", "x", "y", "z", "e", "f"}, Arrays.splice(array, 2, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "x", "y", "z", "f"}, Arrays.splice(array, 3, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "x", "y", "z"}, Arrays.splice(array, 4, 2, "x", "y", "z"));\n    try {\n      Arrays.splice(array, 5, 2, "x", "y", "z");\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "d", "x", "y", "z"}, Arrays.splice(array, -2, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "b", "c", "x", "y", "z", "f"}, Arrays.splice(array, -3, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "b", "x", "y", "z", "e", "f"}, Arrays.splice(array, -4, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"a", "x", "y", "z", "d", "e", "f"}, Arrays.splice(array, -5, 2, "x", "y", "z"));\n    Assert.assertArrayEquals(new String[] {"x", "y", "z", "c", "d", "e", "f"}, Arrays.splice(array, -6, 2, "x", "y", "z"));\n    try {\n      Arrays.splice(array, -7, 2, "x", "y", "z");\n      Assert.fail("Expected ArrayIndexOutOfBoundsException");\n    }\n    catch (final ArrayIndexOutOfBoundsException e) {\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:正如 @denys-s\xc3\xa9guret 正确指出的那样,此实现与 JavaScript 规范不同,因为它不会改变/修改原始数组。相反,此实现返回一个新的数组实例。

\n\n

编辑:此实现可在给定的 Maven 存储库中通过以下 Maven 工件使用:

\n\n
<project>\n  ...\n  <dependencies>\n    <dependency>\n      <groupId>org.safris.commons</groupId>\n      <artifactId>commons-lang</artifactId>\n      <version>1.6.4</version>\n    </dependency>\n  </dependencies>\n  ...\n  <repositories>\n    <repository>\n      <id>mvn.repo.safris.org</id>\n      <url>http://mvn.repo.safris.org/m2</url>\n    </repository>\n  </repositories>\n  ...\n</project>\n
Run Code Online (Sandbox Code Playgroud)\n