Ern*_*dis 5 javascript java splice
someArray.splice(a,b,...)JavaScript 中的方法向数组添加或删除项目。用 Java 语言实现这种方法有什么好的、简单的解决方案呢?假设我们有String[]数组。
Array.prototype.splice()以下是根据JavaScript MDN 规范的该方法的 Java 实现。
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 }\nRun 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 }\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
37646 次 |
| 最近记录: |