现在有集合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循环就搞定了。上面回答的都是什么哦
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;
}
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 数组
}
}