【问题标题】:Generic array tail function通用数组尾函数
【发布时间】:2016-01-21 16:27:12
【问题描述】:

需要使这个通用:

public static String[] tail(String[] array) {
    String[] result = new String[array.length - 1];
    System.arraycopy(array, 1, result, 0, result.length);
    return result;
}

这样:

assertArrayEquals(new Integer[]{2, 3}, tail(new Integer[]{1, 2, 3}));

assertArrayEquals(new String[]{"B", "C"}, tail(new String[]{"A", "B", "C"}));

assertArrayEquals(new String[]{"C"}, tail(tail(new String[]{"A", "B", "C"})));

assertArrayEquals(new String[]{}, tail(new String[]{"A"}).length);

这样tail(new String[0]) 是非法的。

我在 SO 上找不到任何关于数组尾部的内容,只是 Lists 的尾部等,但我想在可变长度参数列表的上下文中使用而不将数组转换为 List

带有可变长度参数的tail的示例用法:

public static File file(String root, String... parts) {
    return file(new File(root), parts);
}

public static File file(File root, String... parts) {
    if (parts.length == 0)
        return root;
    return file(new File(root, parts[0]), tail(parts));
}

【问题讨论】:

  • 投反对票是因为不清楚、无用或未研究。请详细说明您认为这属于哪一类。

标签: java


【解决方案1】:
public static <T> T[] tail(T[] array) {
    if (array.length == 0)
        throw new IllegalArgumentException("Array cannot be empty");

    return java.util.Arrays.copyOfRange(array, 1, array.length);
}

注意,我建议对原始类型进行重载以避免装箱。

【讨论】:

  • 如果你传递null怎么办?
  • @TaharBakir 你从array.length 得到一个 NPE,我可以接受。
  • if (array==null || array.length == 0) 你没有得到 npe 并且你抛出了 runtimeEx 但如果没问题,这里就不争了:)
  • @TaharBakir 我明白了,是的,你可以这样做,但如果我打算这样做,我会使用不同的消息,因为 null 与空数组不同。
  • @TaharBakir 一直在研究这个问题,如果我要在null 上抛出一个自定义异常,那么无论如何,该异常应该是NullPointerException,而不是任何其他异常类型。所以没有必要自己扔。请参阅stackoverflow.com/a/3323006/360211 和第一条评论。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多