情天大圣java下_java中多个list的组合算法,跪求高手解答

网上down了一个,貌似可以:

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

public class HelloHongShu {

/**

* 获取N个集合的笛卡尔积

*

* 说明:假如传入的字符串为:"1,2,3==5,6==7,8"

* 转换成字符串数组为:[[1, 2, 3], [5, 6], [7, 8]]

* a=[1, 2, 3]

* b=[5, 6]

* c=[7, 8]

* 其大小分别为:a_length=3,b_length=2,c_length=2,

* 目标list的总大小为:totalSize=3*2*2 = 12

* 对每个子集a,b,c,进行循环次数=总记录数/(元素个数*后续集合的笛卡尔积个数)

* 对a中的每个元素循环次数=总记录数/(元素个数*后续集合的笛卡尔积个数)=12/(3*4)=1次,每个元素每次循环打印次数:后续集合的笛卡尔积个数=2*2个

* 对b中的每个元素循环次数=总记录数/(元素个数*后续集合的笛卡尔积个数)=12/(2*2)=3次,每个元素每次循环打印次数:后续集合的笛卡尔积个数=2个

* 对c中的每个元素循环次数=总记录数/(元素个数*后续集合的笛卡尔积个数)=12/(2*1)=6次,每个元素每次循环打印次数:后续集合的笛卡尔积个数=1个

*

* 运行结果:

* [[1, 2, 3], [5, 6], [7, 8]]

* 1,5,7,

* 1,5,8,

* 1,6,7,

* 1,6,8,

* 2,5,7,

* 2,5,8,

* 2,6,7,

* 2,6,8,

* 3,5,7,

* 3,5,8,

* 3,6,7,

* 3,6,8]

*

* 从结果中可以看到:

* a中的每个元素每个元素循环1次,每次打印4个

* b中的每个元素每个元素循环3次,每次打印2个

* c中的每个元素每个元素循环6次,每次打印1个

*

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str = "a,b,c==d,e,f==x,y,z";

List result = descartes(str);

System.out.println(result);

}

@SuppressWarnings("rawtypes")

public static List descartes(String str) {

String[] list = str.split("==");

List strs = new ArrayList();

for (int i = 0; i < list.length; i++) {

strs.add(Arrays.asList(list[i].split(",")));

}

System.out.println(strs);

int total = 1;

for (int i = 0; i < strs.size(); i++) {

total *= strs.get(i).size();

}

String[] mysesult = new String[total];

int now = 1;

//每个元素每次循环打印个数

int itemLoopNum = 1;

//每个元素循环的总次数

int loopPerItem = 1;

for (int i = 0; i < strs.size(); i++) {

List temp = strs.get(i);

now = now * temp.size();

//目标数组的索引值

int index = 0;

int currentSize = temp.size();

itemLoopNum = total / now;

loopPerItem = total / (itemLoopNum * currentSize);

int myindex = 0;

for (int j = 0; j < temp.size(); j++) {

//每个元素循环的总次数

for (int k = 0; k < loopPerItem; k++) {

if (myindex == temp.size())

myindex = 0;

//每个元素每次循环打印个数

for (int m = 0; m < itemLoopNum; m++) {

mysesult[index] = (mysesult[index] == null ? "" : mysesult[index] + ",") + ((String) temp.get(myindex));

index++;

}

myindex++;

}

}

}

return Arrays.asList(mysesult);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java,stream可以嵌套使用。例如,我们可以使用stream()方法将一个集合转换为流,然后在该流上使用另一个stream()方法进行另一次流操作。这样做可以高效地进行复杂的数据处理。例如, 一个流里面有多个集合, 我们可以对于每个集合创建一个流, 然后将这些流合并起来进行操作。 ### 回答2: 在Java,流(Stream)是一种用于处理集合元素的功能强大而灵活的工具。流提供了一种流式处理的方式,可以对集合的元素进行过滤、转换、映射等操作。 Java的流可以嵌套,即一个流可以作为另一个流的元素。这种嵌套的流可以称为流的嵌套流(Nested Stream)。嵌套流的主要作用是可以对流进行进一步的转换和处理。 嵌套流的使用可以通过多种方式实现,其一种常见的方式是使用flatMap()方法。flatMap()方法接收一个函数作为参数,该函数将流的元素映射为包含流的嵌套流。通过flatMap()方法,我们可以将嵌套流的元素扁平化,使得最终的流只包含最底层的元素。 例如,假设我们有一个列表,列表的每个元素又是一个列表,我们可以使用flatMap()方法将每个子列表转换为一个嵌套流,然后将这些嵌套流合并为一个流。这样,我们可以在一个流对所有元素进行处理,而不需要嵌套的循环。 另外,嵌套流还可以用于进行多级的数据加工和处理。例如,我们可以先对一个流进行某种转换操作得到一个嵌套流,然后再对嵌套流进行进一步的转换操作,以此类推。通过嵌套流,我们可以将复杂的数据处理任务分解为多个简单的处理步骤,提高代码的可读性和可维护性。 总结来说,Java的流可以嵌套,嵌套流可以通过flatMap()方法实现。嵌套流的使用可以帮助我们简化代码,提高数据处理的效率和可读性。 ### 回答3: 在Java,我们可以使用Stream API来进行流式处理操作。流嵌套流是指在一个流的操作使用另一个流。 在Java,可以通过两种方式来嵌套流:串行嵌套和并行嵌套。 串行嵌套是指将一个流作为另一个流的元素,可以通过flatMap()方法来实现。例如,假设有一个列表,其每个元素是一个列表,我们可以使用flatMap()方法将所有的列表合并成一个大列表。具体代码如下: List<List<Integer>> listOfLists = new ArrayList<>(); listOfLists.add(Arrays.asList(1, 2, 3)); listOfLists.add(Arrays.asList(4, 5, 6)); listOfLists.add(Arrays.asList(7, 8, 9)); List<Integer> mergedList = listOfLists.stream() .flatMap(List::stream) .collect(Collectors.toList()); 上述代码,我们将listOfLists的各个列表合并成一个大列表,并存储在mergedList。 并行嵌套是指在一个流的操作同时使用多个流进行处理。可以通过parallelStream()方法将流转换为并行流来实现。例如,假设有一个列表,我们可以使用parallelStream()方法对列表的元素进行并行处理。具体代码如下: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.parallelStream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum(); 上述代码,我们使用parallelStream()方法将numbers列表转换为并行流,并对其的偶数进行处理和求和。 总之,Java可以使用Stream API进行流嵌套流的操作。通过flatMap()方法可以实现串行嵌套,通过parallelStream()方法可以实现并行嵌套。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值