关于#java#的问题:现在有集合A{1,2,3,4},B{5,6},根据A和B,生成集合C,C中的元素是A中元素

现在有集合A{1,2,3,4,5},B{5,6,7},根据A和B,生成集合C,C中的第一个元素是A中第一项与B中第一项之和,C中的第二个元素是A中第二项与B中第二项之和,C中的第三个元素是A中第三个与B中第三个之和,C中的第四个元素是A中第四个与B中第一个之和,C中的第五个元素是A中第五个与B中第二个之和,C中的第六个元素是A中第一个与B中第三个之和,以此类推。求java的一个简介高效算法。
JDK版本:jdk1.8
#实际生产中,A集合和B集合可能有上千个元素。
#问题中的C集合应该为{6,8,10,9,11,8,7,9,11,10,7,9,8,10,12}

这还需要啥算法啊,一个for循环就搞定了。上面回答的都是什么哦

img


public class test {
    public static int[] generate(int[] a, int[] b) {
        // 确定新生成的数组长度
        int n = a.length * b.length;
        int[] result = new int[n];
        // 依次生成
        for (int i = 0; i < n; i++) {
            result[i] = a[i % a.length] + b[i % b.length];
        }
        return result;
    }

    public static void main(String[] args) {
        int[] a = { 1, 2, 3, 4, 5 };
        int[] b = { 5, 6, 7 };
        // 生成数据
        int[] resutl = generate(a, b);
        // 打印数据
        for (int i = 0; i < resutl.length; i++) {
            System.out.printf("%d ", resutl[i]);
        }
    }
}

并行计算好点吧,我这里用了一个线程实现:

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class CalculateCParallel {
    public static void main(String[] args) throws InterruptedException {
        ArrayList<Integer> A = new ArrayList<>();
        A.add(1);
        A.add(2);
        A.add(3);
        A.add(4);
        A.add(5);

        ArrayList<Integer> B = new ArrayList<>();
        B.add(5);
        B.add(6);
        B.add(7);

        ArrayList<Integer> C = new ArrayList<>();

        int sizeA = A.size();
        int sizeB = B.size();

        int numThreads = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(numThreads);

        for (int i = 0; i < sizeA; i++) {
            int index = i % sizeB;
            ArrayList<Integer> subsetA = new ArrayList<>(A.subList(i, i + 1));
            ArrayList<Integer> subsetB = new ArrayList<>(B.subList(index, index + 1));

            executor.execute(new CalculateThread(subsetA, subsetB, C, i));
        }

        executor.shutdown();
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

        System.out.println(C);
    }
}

class CalculateThread implements Runnable {
    private ArrayList<Integer> subsetA;
    private ArrayList<Integer> subsetB;
    private ArrayList<Integer> C;
    private int index;

    public CalculateThread(ArrayList<Integer> subsetA, ArrayList<Integer> subsetB, ArrayList<Integer> C, int index) {
        this.subsetA = subsetA;
        this.subsetB = subsetB;
        this.C = C;
        this.index = index;
    }

    public void run() {
        int sum = subsetA.get(0) + subsetB.get(0);
        C.set(index, sum);
    }
}



package com.demo.code;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo01 {
    public static void main(String[] args) {
        List<Integer> A_col = new ArrayList<>();
        A_col.addAll(Arrays.asList(1,2,3,4,5));

        List<Integer> B_col = new ArrayList<>();
        B_col.addAll(Arrays.asList(5,6,7));

        List<Integer> C_col = new ArrayList<>();
        for (int i = 0; i < A_col.size() * B_col.size(); i++) {
            C_col.add(A_col.get(i % A_col.size()) + B_col.get(i % B_col.size()));
        }
        System.out.println(A_col);
        System.out.println(B_col);
        System.out.println(C_col);
    }
}


public static void generalC(List<Integer> a, List<Integer> b) {
        int aLen = a.size();
        int bLen = b.size();
        int cSize = aLen;
        if(aLen < bLen) {
            cSize = bLen;
        }
        System.out.println(cSize);
        List<Integer> c = new ArrayList<>();
        for(int i=0;i<cSize;i++) {
            int i1 = i % aLen;
            int i2 = i % bLen;
            int value = a.get(i1) + b.get(i2);
            c.add(value);
        }
        System.out.print("A:");
        System.out.println(a);
        System.out.print("B:");
        System.out.println(b);
        System.out.print("C:");
        System.out.println(c);
    }

    /**
     * 获取C集合
     *
     * @param a     A集合
     * @param b     B集合
     * @param cSize 期待的C集合大小 如果传null, 则 为A集合与B集合 中的最大值
     *
     * @return
     */
    public static List<Integer> getCList(List<Integer> a, List<Integer> b, Integer cSize) {
        if (cSize == null) {
            cSize = a.size() > b.size() ? a.size() : b.size();
        }
        List<Integer> c = new ArrayList<>(cSize);

        for (int i = 0; i < cSize; i++) {
            int aIndex = i % a.size();
            int bIndex = i % b.size();
            int value = a.get(aIndex) + b.get(bIndex);
            c.add(value);
        }
        return c;
    }
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/744394
  • 以下回答由chatgpt基于相关博客总结生成:
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
    
            List<Integer> A = new ArrayList<>(Arrays.asList(1,2,3,4,5));
            List<Integer> B = new ArrayList<>(Arrays.asList(5,6,7));
            List<Integer> C = new ArrayList<>();
    
            for (int i = 0; i < Math.max(A.size(), B.size()); i++) {
                int sum = (i < A.size() ? A.get(i) : 0) + (i < B.size() ? B.get(i) : 0);
                C.add(sum);
            }
    
            System.out.println(C);
        }
    }
    

以下 代码可以用来将两个集合按照题目的要求生成第三个集合,它使用了 Java 8 中的流式编程和并行计算来优化程序的执行效率。对于处理上万的数据,这段代码的效率应该是比较高的,因为它使用了并行计算来利用多核处理器的性能,同时也使用了流式编程来简化代码,提高了代码的可读性和可维护性。另外,这段代码还使用了位运算来计算 C 数组中的元素,提高了计算效率。总体来说,我认为这段代码是一个简单高效的算法,适合处理大规模数据。


import java.util.Arrays;
import java.util.stream.IntStream;

public class Test {
    public static void main(String[] args) {
        int[] A = {1, 2, 3, 4, 5};
        int[] B = {5, 6, 7};
        int[] C = IntStream.range(0, A.length + B.length - 1)
                .parallel()  // 将流转换成并行流
                .map(i -> {
                    int sum = 0;
                    for (int j = Math.max(0, i - B.length + 1); j <= Math.min(i, A.length - 1); j++) {
                        sum |= A[j] & B[i - j];  // 计算 C 数组中的元素
                    }
                    return sum;
                })
                .toArray();  // 将结果转换成数组
        System.out.println(Arrays.toString(C));  // 输出 C 数组
    }
}