有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何连接两个参数化类型的数组(在guava中)

我在寻找一种简单的方法来迭代两个数组。 由于预计阵列不会很大,我想我可以直接将它们连接起来

不幸的是,调用番石榴看起来很可怕:

        Class<? extends MyInterface>[] a2 = ...
        Class<? extends MyInterface>[] a1 = ...

        ObjectArrays.concat(a1, a2,
                (Class<Class<? extends MyInterface>>) MyInterface.class.getClass());

有没有可能让它更具可读性


共 (2) 个答案

  1. # 1 楼答案

    最后我写了一些自己的东西

    有一种主要方法可以完成所有工作:

    @SuppressWarnings("unchecked")
    private static <T> T[] mergeInternal(@Nonnull T[] first,
                                @Nonnull T[] second,
                                @Nullable T[] third,
                                @Nullable T[] fourth,
                                @Nullable T[] fifth,
                                @Nullable T[] sixth) {
        int overallLength = first.length + second.length;
        if (third != null) {
            overallLength += third.length;
        }
        if (fourth != null) {
            overallLength += fourth.length;
        }
        if (fifth != null) {
            overallLength += fifth.length;
        }
        if (sixth != null) {
            overallLength += sixth.length;
        }
    
        Object[] joinedArray = (Object[]) Array.newInstance(first.getClass().getComponentType(), overallLength);
        System.arraycopy(first, 0, joinedArray, 0, first.length);
        System.arraycopy(second, 0, joinedArray, first.length, second.length);
        int copyTargetPosition = first.length + second.length;
        if (third != null) {
            System.arraycopy(third, 0, joinedArray, copyTargetPosition, third.length);
            copyTargetPosition += third.length;
        }
        if (fourth != null) {
            System.arraycopy(fourth, 0, joinedArray, copyTargetPosition, fourth.length);
            copyTargetPosition += fourth.length;
        }
        if (fifth != null) {
            System.arraycopy(fifth, 0, joinedArray, copyTargetPosition, fifth.length);
            copyTargetPosition += fifth.length;
        }
        if (sixth != null) {
            System.arraycopy(sixth, 0, joinedArray, copyTargetPosition, sixth.length);
        }
        return (T[]) joinedArray;
    }
    

    。。然后,对于每个参数组合(2..6),都有一个输入方法,如下所示:

    public static <T> T[] merge(@Nonnull T[] first, @Nonnull T[] second) {
        Preconditions.checkNotNull(first);
        Preconditions.checkNotNull(second);
        return mergeInternal(first, second, null, null, null, null);
    }
    
    public static <T> T[] merge(@Nonnull T[] first, @Nonnull T[] second, @Nonnull T[] third)
    ...
    public static <T> T[] merge(@Nonnull T[] first, @Nonnull T[] second, @Nonnull T[] third, @Nonnull T[] fourth)
    

    等等

    我认为一个人很少需要合并超过6个数组,如果需要的话,可以很容易地扩展给定的想法

  2. # 2 楼答案

    您可以将Arrays.asListIterables.concat组合起来,而不是使用ObjectArrays。这样,您就不需要提供类名

    Iterables.concat(Arrays.asList(a1), Arrays.asList(a2))
    

    如果使用静态导入,它的可读性将大大提高:

    import static com.google.common.collect.Iterables.concat;
    import static java.util.Arrays.asList;
    
    ...
    
    concat(asList(a1), asList(a2))