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 怎样实现一个线程不断往集合里添加元素另一线程再从集合中获取元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)