java 从几十万条数据的list集合中随机取出1000个元素重新生成集合

java 从几十万条数据的list集合中随机取出1000个元素重新生成集合,第1张

List<String> list = new ArrayList<String>();

List<String> new_list = new ArrayList<String>();

for (int i = 0 ; i < 1200000;i++)

{

listadd(i+"");

}

long time1 = SystemcurrentTimeMillis();

Collectionsshuffle(list);

new_list = listsubList(0,1000);//方法1耗时65~130

new_list = createRandomList(list,1000);//方法2耗时2~5

long time2 = SystemcurrentTimeMillis();

Systemoutprintln(time2 - time1);

private static List createRandomList(List list, int n)

{

Map map = new HashMap();

List listNew = new ArrayList();

if (listsize() <= n)

{

return list;

}

else

{

while (mapsize() < n)

{

int random = (int) (Mathrandom() listsize());

if (!mapcontainsKey(random))

{

mapput(random, "");

listNewadd(listget(random));

}

}

return listNew;

}

}

这个方法测试

集合A有m个元素,集合B有n个元素,从两个集合中各取一个元素,不同方法总数是mn。

第一个m种

第二个n种

当然是mn。

两个常用的排列基本计数原理及应用:

1、加法原理和分类计数法:

每一类中的每一种方法都可以独立地完成此任务。两类不同办法中的具体方法,互不相同(即分类不重)。完成此任务的任何一种方法,都属于某一类(即分类不漏)。

2、乘法原理和分步计数法:

任何一步的一种方法都不能完成此任务,必须且只须连续完成这n步才能完成此任务。各步计数相互独立。只要有一步中所采取的方法不同,则对应的完成此事的方法也不同。

这个没有什么特别需要注意的,主要就是你所用的集合必须是线程安全的,同一时间之允许一个线程访问这个几个,API里有提供这种集合,像Vector这种,不然你负责add元素的线程还没有执行呢,负责get的线程就去取了,这是会出异常的

import javautilArrayList;

import javautilList;

public class XX {

 

    public static void main(String[] args)  

    {  

        String[] arr1 = { "1", "2","3","4"};  

        String[] arr2 = { "a", "b","c","d" };  

        String[] arr3 = { "A","B","G","H" };  

        List<String[]> list = new ArrayList<String[]>();  

        listadd(arr1);  

        listadd(arr2);  

        listadd(arr3);  

        test(list, arr1, "");  

    }  

  

    public static void test(List<String[]> list, String[] arr, String str)  

    {  

        for (int i = 0; i < listsize(); i++)  

        {  

            //取得当前的数组  

            if (i == listindexOf(arr))  

            {  

                //迭代数组  

                for (String st : arr)  

                {  

                    st = str + st;  

                    if (i < listsize() - 1)  

                    {  

                        test(list, listget(i + 1), st);  

                    }  

                    else if (i == listsize() - 1)  

                    {  

                        Systemoutprintln(st);  

                    }  

                }  

            }  

        }  

    }  

}

计算结果:

1aA

1aB

1aG

1aH

1bA

1bB

1bG

1bH

1cA

1cB

1cG

1cH

1dA

1dB

1dG

1dH

2aA

2aB

2aG

2aH

2bA

2bB

2bG

2bH

2cA

2cB

2cG

2cH

2dA

2dB

2dG

2dH

3aA

3aB

3aG

3aH

3bA

3bB

3bG

3bH

3cA

3cB

3cG

3cH

3dA

3dB

3dG

3dH

4aA

4aB

4aG

4aH

4bA

4bB

4bG

4bH

4cA

4cB

4cG

4cH

4dA

4dB

4dG

4dH

A中只有一个元素,必须取,

B中取一个元素,有2种取法,

C中取一个元素,有3种取法,

再加上这三个元素是要排列的,A33(两个3分别是上下角标),

于是23321=36种,

但是由于B、C中有重复元素2,也就是点(1,2,2)、(1,2,1)、(2,2,1)分别都多了一个,就要减去3,

36-3=33

hashset集合无法得到里面的第n个元素。

PS:因为hashset集合是无序集合,集合元素顺序不固定,所以无法指定获取第n个元素。

HashSet 集合:

HashSet<T> 类是一个实现 ICollection 接口和 ICollection<T> 泛型接口的 set 集合。从 NET Framework 4开始,HashSet<T> 类实现了 ISet<T> 类。

HashSet 集合类型:

UnionWith:并集或 Set 加法

IntersectWith:交集

ExceptWith:Set 减法

SymmetricExceptWith:余集

以上就是关于java 从几十万条数据的list集合中随机取出1000个元素重新生成集合全部的内容,包括:java 从几十万条数据的list集合中随机取出1000个元素重新生成集合、集合A有m个元素,集合B有n个元素,从两个集合中各取一个元素,不同方法总数是多少、java 怎样实现一个线程不断往集合里添加元素另一线程再从集合中获取元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9741088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存