62,615
社区成员
发帖
与我相关
我的任务
分享
public static void test(List<List<String>> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).size(); j++) {
for (int k = i + 1; k < list.size(); k++) {
for (int m = 0; m < list.get(k).size(); m++) {
System.out.println(list.get(i).get(j) + "---" + list.get(k).get(m));
}
}
}
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Demo56 {
static Random random = new Random();
public static void main(String[] args) {
final List<List<Integer>> list = new ArrayList<>();
long times[] = new long[100], times1[] = new long[100], times2[] = new long[100], times3[] = new long[100]
, total = 0, total1 = 0, total2 = 0, total3 = 0, start;
int x = 200, y = 200;
for (int i = 0; i < times1.length; i++) {
list.clear();
// 制作测试数据, 不定长二维数组X, Y
for (int j = 0; j < x; ) {
int len = random.nextInt(y);
if (len == 0) continue;
List<Integer> sublist = new ArrayList<>(len);
list.add(sublist);
for (int a = 0; a < len; a++) {
sublist.add(random.nextInt(10));
}
j++;
}
// 1.各方法中输出的_j是对比结果是否相同
// 2.这里没有采用多线程去测试3种方法的效率,因为多线程存在资源的争夺问题,哪个线程运气好争夺资源多哪个就快,对结果影响大
// 3.为了避免IO对结果造成的影响这里只取list的值不做字符串相加操作
// 4.方便处理,测试方法修改了数据类型由原来的List<List<String>>改为List<List<Integer>>,虽然存在自动封包的过程,但是发生在制作数据环节
// 5.测试结果(平均时间排序), 二维转一维遍历 < 直接遍历 < ... < 二维看着一维遍历
// 二维转一维遍历
start = System.currentTimeMillis();
test(list);
times[i] = System.currentTimeMillis() - start;
// 二维看着一维遍历
start = System.currentTimeMillis();
test1(list);
times1[i] = System.currentTimeMillis() - start;
// 直接遍历
start = System.currentTimeMillis();
test2(list);
times2[i] = System.currentTimeMillis() - start;
// ...
start = System.currentTimeMillis();
process(list);
times3[i] = System.currentTimeMillis() - start;
}
// 方法test
System.out.println("times : " + Arrays.toString(times));
for (long t : times) total += t;
System.out.println("avg : " + (total/times.length));
// 方法test1
System.out.println("times : " + Arrays.toString(times1));
for (long t : times1) total1 += t;
System.out.println("avg : " + (total1/times1.length));
// 方法test2
System.out.println("times : " + Arrays.toString(times2));
for (long t : times2) total2 += t;
System.out.println("avg : " + (total2/times2.length));
// 方法process
System.out.println("times : " + Arrays.toString(times3));
for (long t : times3) total3 += t;
System.out.println("avg : " + (total3/times3.length));
}
public static void test(List<List<Integer>> list) {
List<Integer> temp = new ArrayList<>();
int size = list.size(), len = 0, index = 0, idx = 0, count = 0, _index = 0, _j = 0;
int[] lens = new int[size];
for (int i = 0; i < size; i++) {
temp.addAll(list.get(i));
lens[i] = list.get(i).size();
count += lens[i];
}
while (index < count - lens[size - 1]) {
idx = len + lens[_index];
while (idx < count) {
// System.out.println(temp.get(index) + "--" + temp.get(idx++));
temp.get(index); temp.get(idx++);
_j++;
}
if (len + lens[_index] == ++index) {
len += lens[_index++];
}
}
System.out.println(_j);
}
public static void test1(List<List<Integer>> list) {
int size = list.size(), len = 0, index = 0, idx, count = 0, _index = 0, _j = 0, end;
int[] lens = new int[size];
for (int i = 0; i < size; i++) {
lens[i] = list.get(i).size();
count += lens[i];
}
end = count - lens[size - 1];
while (index < end) {
idx = len + lens[_index];
int __index = _index + 1, __len = idx;
while (idx < count) {
if (idx == __len + lens[__index]) {
__len += lens[__index];
__index++;
}
// System.out.println(list.get(_index).get(index-len) + "--" + list.get(__index).get(idx++-__len));
list.get(_index).get(index-len); list.get(__index).get(idx++-__len);
_j++;
}
if (len + lens[_index] == ++index) {
len += lens[_index++];
}
}
System.out.println(_j);
}
public static void test2(List<List<Integer>> list) {
int _j = 0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).size(); j++) {
for (int k = i + 1; k < list.size(); k++) {
for (int m = 0; m < list.get(k).size(); m++) {
// System.out.println(list.get(i).get(j) + "--" + list.get(k).get(m));
list.get(i).get(j); list.get(k).get(m);
_j++;
}
}
}
}
System.out.println(_j);
}
static int _j = 0;
private static void process(List<List<Integer>> lists){
_j = 0;
assert lists.size() >= 3; //optional
List<Integer> list1 = null;
List<Integer> list2 = null;
for(int i = 0 ; i < lists.size(); i ++){
list1 = lists.get(i);
list2 = new ArrayList<>();
for(int j = i + 1 ; j < lists.size(); j ++){
list2.addAll(lists.get(j));
}
process(list1,list2);
}
System.out.println(_j);
}
private static void process(List<Integer> list1,List<Integer> list2){
for(Integer str1 : list1){
for(Integer str2 : list2){
// System.out.printf("%s--%s ",str1,str2);
_j++;
}
// System.out.println();
}
}
}
我试了试你写的程序,多个list的时候就有问题了。。。[/quote]
嗯,最后一个判断有点问题
[code=java]public static void test1(List<List<Integer>> list) {
int size = list.size(), len = 0, index = 0, idx, count = 0, _index = 0,end;
int[] lens = new int[size];
for (int i = 0; i < size; i++) {
lens[i] = list.get(i).size();
count += lens[i];
}
end = count - lens[size - 1];
while (index < end) {
idx = len + lens[_index];
int __index = _index + 1, __len = idx;
while (idx < count) {
if (idx == __len + lens[__index]) {
__len += lens[__index];
__index++;
}
System.out.println(list.get(_index).get(index-len) + "--" + list.get(__index).get(idx++-__len));
}
if (len + lens[_index] == ++index) {
len += lens[_index++];
}
}
}
public static void test1(List<List<String>> list) {
int size = list.size(), len = 0, index = 0, idx, count = 0, _index = 0;
int[] lens = new int[size];
for (int i = 0; i < size; i++) {
lens[i] = list.get(i).size();
count += lens[i];
}
while (index < count - lens[size - 1]) {
idx = len + lens[_index];
int __index = _index + 1, __len = idx;
while (idx < count) {
if (idx == __len + lens[__index]) {
__len += lens[__index];
__index++;
}
System.out.println(list.get(_index).get(index-len) + "--" + list.get(__index).get(idx++-__len));
}
if (len == ++index || lens[_index] == index) {
len += lens[_index++];
}
}
}
import java.util.List;
import java.util.ArrayList;
public class Test{
@SuppressWarnings("unchecked")
public static void main(String[] args){
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
list1.add("1"); list1.add("2"); list1.add("3");
list2.add("4"); list2.add("5");
list3.add("6"); list3.add("7"); list3.add("8");
process(list1,list2,list3);
}
@SuppressWarnings("unchecked")
private static void process(List<String> ... lists){
assert lists.length >= 3; //optional
List<String> list1 = null;
List<String> list2 = null;
for(int i = 0 ; i < lists.length ; i ++){
list1 = lists[i];
list2 = new ArrayList<>();
for(int j = i + 1 ; j < lists.length ; j ++){
list2.addAll(lists[j]);
}
process(list1,list2);
}
}
private static void process(List<String> list1,List<String> list2){
for(String str1 : list1){
for(String str2 : list2){
System.out.printf("%s--%s ",str1,str2);
}
System.out.println();
}
}
}
public static void test(List<List<String>> list) {
List<String> temp = new ArrayList<>();
int size = list.size(), len = 0, index = 0, idx = 0, count = 0, _index = 0;
int[] lens = new int[size];
for (int i = 0; i < size; i++) {
temp.addAll(list.get(i));
lens[i] = list.get(i).size();
count += lens[i];
}
while (index < count - lens[size - 1]) {
idx = len + lens[_index];
while (idx < count) {
System.out.println(temp.get(index) + "--" + temp.get(idx++));
}
if (len == ++index || lens[_index] == index) {
len += lens[_index++];
}
}
}