如何从两个数组中替换字符? [英] How do I alternate chars from two arrays?

查看:67
本文介绍了如何从两个数组中替换字符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要帮助弄清楚如何组合两个char数组,然后让元素在新数组中交替出现.给定的数组可以具有不同的长度,例如:char1 = [B,D] char2 = [c,R,5]输出应为char3 = [B,c,D,r,5]

I need help with figuring out how to combine two char arrays and then have the elements alternate in a new array. The given arrays can be different lengths, for example: char1=[B,D] char2 = [c,R,5] the output should be char3= [B,c,D,r,5]

char[] ch3 = new char[ch1.length + ch2.length];
int count = 0;
int count2 = 0;
for(int i = 0; i < ch3.length; i++){
    if(i < ch1.length) {
        if(i%2 == 0 || count2 == ch2.length) {
            ch3[i] = ch1[count];
            count++;
        }
    }
    if(i <ch2.length) {
        if(i%2 != 0 || count == ch1.length) {
            ch3[i] = ch2[count2];
            count2++;
        }
    }
}
return ch3;

推荐答案

由oleg.cherednik的答案类似的解决方案,但不需要缓慢的余数运算符.

Similar solution to answer by oleg.cherednik, but without the need for slow % remainder operator.

public static int[] alternate(int[] a1, int[] a2) {
    int[] a3 = new int[a1.length + a2.length];
    for (int i1 = 0, i2 = 0, i3 = 0; i3 < a3.length; ) {
        if (i1 < a1.length)
            a3[i3++] = a1[i1++];
        if (i2 < a2.length)
            a3[i3++] = a2[i2++];
    }
    return a3;
}

测试

System.out.println(Arrays.toString(alternate(
        new int[] { 1, 2, 3 },
        new int[] { 44, 55, 66, 77, 88 })));
System.out.println(Arrays.toString(alternate(
        new int[] { 44, 55, 66, 77, 88 },
        new int[] { 1, 2, 3 })));

输出

[1, 44, 2, 55, 3, 66, 77, 88]
[44, 1, 55, 2, 66, 3, 77, 88]


更新

可以轻松增强此算法以合并许多数组:

This algorithm can easily be enhanced to merge many arrays:

public static int[] alternate(int[]... arrays) {
    int[] result = new int[Stream.of(arrays).mapToInt(a -> a.length).sum()];
    int[] ai = new int[arrays.length];
    for (int j = 0; j < result.length; )
        for (int i = 0; i < arrays.length; i++)
            if (ai[i] < arrays[i].length)
                result[j++] = arrays[i][ai[i]++];
    return result;
}

测试

System.out.println(Arrays.toString(alternate(
        new int[] { 1, 2, 3 },
        new int[] { 44, 55, 66, 77, 88 },
        new int[] { 12, 34 },
        new int[] { 5, 6, 7, 8 })));

输出

[1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]


更新2

它也可以用于收藏集:

@SafeVarargs
public static <T> List<T> alternate(Iterable<? extends T>... inputs) {
    List<T> result = new ArrayList<>();
    @SuppressWarnings("unchecked")
    Iterator<? extends T>[] iter = new Iterator[inputs.length];
    for (int i = 0; i < inputs.length; i++)
        iter[i] = inputs[i].iterator();
    for (int prevSize = -1; prevSize < result.size(); ) {
        prevSize = result.size();
        for (int i = 0; i < inputs.length; i++)
            if (iter[i].hasNext())
                result.add(iter[i].next());
    }
    return result;
}

public static <T> List<T> alternate(Collection<? extends Iterable<? extends T>> inputs) {
    @SuppressWarnings("unchecked")
    Iterable<? extends T>[] iterables = inputs.toArray(new Iterable[0]);
    return alternate(iterables);
}

测试

System.out.println(alternate(
        Arrays.asList(1, 2, 3),
        Arrays.asList(44, 55, 66, 77, 88),
        Arrays.asList(12, 34),
        Arrays.asList(5, 6, 7, 8)));
System.out.println(alternate(Arrays.asList(
        Arrays.asList(1, 2, 3),
        Arrays.asList(44, 55, 66, 77, 88),
        Arrays.asList(12, 34),
        Arrays.asList(5, 6, 7, 8))));

输出

[1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]
[1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]

这篇关于如何从两个数组中替换字符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆